OAuth 2.0: uwierzytelnianie użytkowników w Google

OAuth2 to standardowy protokół autoryzacji. Zapewnia on użytkownikom przyznania aplikacjom internetowym i komputerowym dostępu do informacji prywatnych bez udostępniania swojej nazwy użytkownika, hasła i innych danych logowania.

W tym samouczku zostało utworzone rozszerzenie uzyskujące dostęp do kontaktów Google użytkownika za pomocą interfejsu Osoby Google API i Chrome Identity API. Ponieważ rozszerzenia nie wczytują się zbyt długo HTTPS, nie można wykonać lub ustawiają pliki cookie, korzystają z protokołu OAuth2 interfejsu Chrome Identity API.

Rozpocznij

Zacznij od utworzenia katalogu i następujących plików inicjujących.

manifest.json

Dodaj plik manifestu. W tym celu utwórz plik o nazwie manifest.json i dodaj ten kod.

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 3,
  "action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "service_worker": "service-worker.js"
  }
}

service-worker.js

Dodaj skrypt service worker rozszerzenia, tworząc plik o nazwie service-worker.js i dołącz do niego poniższy kod.

chrome.action.onClicked.addListener(function() {
  chrome.tabs.create({url: 'index.html'});
});

index.html

Dodaj plik HTML o nazwie index.html i uwzględnij poniższy kod.

<html>
  <head>
    <title>FriendBlock</title>
    <style>
      button {
        padding: 10px;
        background-color: #3C79F8;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <button>FriendBlock Contacts</button>
    <div id="friendDiv"></div>
  </body>
</html>

Zachowaj spójny identyfikator rozszerzenia

Zachowanie pojedynczego identyfikatora jest kluczowe podczas tworzenia aplikacji. Aby zachować spójny identyfikator:

Prześlij rozszerzenie do panelu dewelopera

Umieść katalog rozszerzenia w pliku .zip i prześlij go do programisty Chrome Panel bez publikowania:

  1. W panelu dewelopera kliknij Dodaj nowy element.
  2. Kliknij Przeglądaj pliki, wybierz plik ZIP rozszerzenia i go prześlij.
  3. Otwórz kartę Pakiet i kliknij Wyświetl klucz publiczny.

Karta pakietu panelu dewelopera

Po otwarciu wyskakującego okienka wykonaj te czynności:

  1. Skopiuj kod pomiędzy -----BEGIN PUBLIC KEY----- a -----END PUBLIC KEY-----.
  2. Usuń znaki nowego wiersza, aby zrobić z niego jeden wiersz tekstu.

Wyskakujące okienko klucza publicznego

Dodaj kod w polu manifest.json w polu "key". Dzięki temu rozszerzenie będzie używać tego samego identyfikatora.

{ // manifest.json
  "manifest_version": 3,
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8GGC2u3UD9WI3MkmBgyiDPP2OreImEQhPvwpliioUMJmERZK3zPAx72z8MDvGp7Fx7ZlzuZpL4yyp4zXBI+MUhFGoqEh32oYnm4qkS4JpjWva5Ktn4YpAWxd4pSCVs8I4MZms20+yx5OlnlmWQEwQiiIwPPwG1e1jRw0Ak5duPpE3uysVGZXkGhC5FyOFM+oVXwc1kMqrrKnQiMJ3lgh59LjkX4z1cDNX3MomyUMJ+I+DaWC2VdHggB74BNANSd+zkPQeNKg3o7FetlDJya1bk8ofdNBARxHFMBtMXu/ONfCT3Q2kCY9gZDRktmNRiHG/1cXhkIcN1RWrbsCkwIDAQAB",
}

Porównaj identyfikatory

Otwórz stronę Zarządzanie rozszerzeniami na chrome://extensions i sprawdź, czy Tryb programisty jest włączony. i prześlij katalog bez pakietu rozszerzeń. Porównywanie identyfikatora rozszerzenia w zarządzaniu rozszerzeniami do identyfikatora produktu w panelu dewelopera. Powinny być takie same.

Identyfikator elementu
dopasowanie rozszerzenia

Utwórz identyfikator klienta OAuth

Otwórz konsolę interfejsów API Google i utwórz nowy projekt. Gdy wszystko będzie gotowe, wybierz Na pasku bocznym kliknij Dane logowania, kliknij Utwórz dane logowania i wybierz Identyfikator klienta OAuth.

Utwórz dane logowania na potrzeby rozszerzenia

Na stronie Tworzenie identyfikatora klienta kliknij Rozszerzenie do Chrome. Wpisz nazwę rozszerzenia i miejsca. identyfikator rozszerzenia na końcu adresu URL w polu Identyfikator aplikacji.

Podawanie informacji o rozszerzeniu

Na koniec kliknij Utwórz. Konsola udostępni identyfikator klienta OAuth.

Zarejestruj OAuth w pliku manifestu

Dodaj pole "oauth2" do pliku manifestu rozszerzenia. Umieść wygenerowany identyfikator klienta OAuth w "client_id" Na razie uwzględnij pusty ciąg znaków w polu "scopes".

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes":[""]
  },
  ...
}

Zainicjuj pierwszy przepływ OAuth

Zarejestruj uprawnienia identity w pliku manifestu.

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "permissions": [
    "identity"
  ],
  ...
}

Utwórz plik służący do zarządzania przepływem OAuth o nazwie oauth.js i dodaj do niego poniższy kod.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      console.log(token);
    });
  });
};

Umieść tag skryptu dla oauth.js w nagłówku index.html.

...
  <head>
    <title>FriendBlock</title>
    ...
    <script type="text/javascript" src="oauth.js"></script>
  </head>
...

Załaduj ponownie rozszerzenie i kliknij ikonę przeglądarki, aby otworzyć index.html. Otwórz konsolę i kliknij „Kontakty FreendBlock”. Przycisk W konsoli pojawi się token OAuth.

Wyświetl token w konsoli

Włączanie interfejsu Google People API

Wróć do konsoli interfejsów API Google i na pasku bocznym wybierz Biblioteka. Wyszukaj „osoby Google” API”, kliknij właściwy wynik i włącz go.

Włączanie interfejsu People API

Dodaj bibliotekę klienta Google People API do pliku "scopes" w pliku manifestu rozszerzenia.

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/contacts.readonly"
    ]
  },
  ...
}

Wróć do konsoli interfejsów API Google i wróć do danych logowania. Kliknij „Utwórz dane logowania”. oraz wybierz „Klucz interfejsu API”. z menu rozwijanego.

Tworzenie danych logowania do interfejsu People API

Zachowaj wygenerowany klucz interfejsu API do późniejszego użycia.

Tworzenie pierwszego żądania do interfejsu API

Teraz, gdy rozszerzenie ma odpowiednie uprawnienia, dane logowania i może autoryzować użytkownika Google, może wysyła żądania danych za pomocą interfejsu People API. Zaktualizuj kod w aplikacji oauth.js, tak aby był zgodny z podanym niżej.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
          init)
          .then((response) => response.json())
          .then(function(data) {
            console.log(data)
          });
    });
  });
};

Zastąp API_KEY kluczem interfejsu API wygenerowanym w konsoli interfejsów API Google. Rozszerzenie powinien zarejestrować obiekt JSON zawierający tablicę people/account_id w memberResourceNames.

Zablokuj twarze

Gdy rozszerzenie zwraca listę kontaktów użytkownika, może wysłać dodatkowe żądania pobrania profili i informacji tych kontaktów . Rozszerzenie będzie używać funkcji memberResourceNames, aby pobrać informacje o zdjęciach kontaktów użytkownika. Zaktualizuj aplikację oauth.js do dodaj ten kod.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=<API_Key_Here>',
          init)
          .then((response) => response.json())
          .then(function(data) {
            let photoDiv = document.querySelector('#friendDiv');
            let returnedContacts = data.memberResourceNames;
            for (let i = 0; i < returnedContacts.length; i++) {
              fetch(
                  'https://people.googleapis.com/v1/' + returnedContacts[i] +
                      '?personFields=photos&key=API_KEY',
                  init)
                  .then((response) => response.json())
                  .then(function(data) {
                    let profileImg = document.createElement('img');
                    profileImg.src = data.photos[0].url;
                    photoDiv.appendChild(profileImg);
                  });
            };
          });
    });
  });
};

Załaduj ponownie i wróć do rozszerzenia. Kliknij przycisk FriendBlock! Oglądaj twarze kontaktów w jeden ekran.

Blokowane twarze kontaktów