OAuth 2.0: uwierzytelnianie użytkowników w Google

OAuth2 to protokół autoryzacji zgodny ze standardami branżowymi. Dzięki niemu użytkownicy mogą przyznawać aplikacjom internetowym i komputerowym dostęp do prywatnych informacji bez udostępniania swojej nazwy użytkownika, hasła i innych prywatnych danych logowania.

W tym samouczku tworzymy rozszerzenie, które uzyskuje dostęp do kontaktów Google użytkownika za pomocą interfejsów Google People API i Chrome Identity API. Rozszerzenia nie wczytują się przez HTTPS, nie mogą wykonywać przekierowań ani ustawiać plików cookie, tylko używają interfejsu Chrome Identity API do korzystania z protokołu OAuth2.

Rozpocznij

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

manifest.json

Dodaj plik manifestu, tworząc plik o nazwie manifest.json i dołączając w nim poniższy 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"
  }
}

Skrypt service worker.js

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

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

index.html

Dodaj plik HTML o nazwie index.html i dołącz do niego 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>

Zachowuj spójny identyfikator rozszerzenia

Zachowanie jednego identyfikatora jest niezbędne podczas programowania. Aby zachować spójny identyfikator, wykonaj te czynności:

Prześlij rozszerzenie do panelu dewelopera

Spakuj katalog rozszerzenia do pliku .zip i prześlij go do panelu dewelopera Chrome bez jego 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 w Panelu dewelopera

Gdy wyskakujące okienko jest otwarte, wykonaj te czynności:

  1. Skopiuj kod pomiędzy -----BEGIN PUBLIC KEY----- a -----END PUBLIC KEY-----.
  2. Usuń nowe wiersze, aby zmienić je w jeden wiersz tekstu.

Wyskakujące okienko klucza publicznego

Dodaj kod w polu manifest.json pod polem "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ądzania rozszerzeniami na chrome://extensions, upewnij się, że tryb programisty jest włączony, i prześlij katalog rozszerzeń bez pakietu. Porównaj identyfikator rozszerzenia na stronie zarządzania rozszerzeniami z identyfikatorem produktu w panelu dewelopera. Powinny do siebie pasować.

Identyfikator rozszerzenia

Tworzenie identyfikatora klienta OAuth

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

Utwórz dane logowania do rozszerzenia

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

Podawanie informacji o rozszerzeniu

Aby zakończyć, kliknij Utwórz. Konsola poda identyfikator klienta OAuth.

Zarejestruj protokół OAuth w pliku manifestu

Dodaj pole "oauth2" w pliku manifestu rozszerzenia. Umieść wygenerowany identyfikator klienta OAuth w obszarze "client_id". Na razie umieść pusty ciąg w elemencie "scopes".

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

Rozpocznij pierwszy przepływ OAuth

Zarejestruj uprawnienie identity w pliku manifestu.

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

Utwórz plik, który będzie zarządzać procesem OAuth o nazwie oauth.js, i umieść w nim 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 elementu 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 przycisk „Zablokuj kontakty znajomych”. W konsoli pojawi się token OAuth.

Wyświetl token w konsoli

Włącz interfejs Google People API

Wróć do konsoli interfejsów API Google i na pasku bocznym wybierz Biblioteka. Wyszukaj „Google People API”, kliknij odpowiedni 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 do danych logowania. Kliknij „Utwórz dane logowania” i z menu wybierz „Klucz interfejsu API”.

Tworzenie danych logowania do interfejsu People API

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

Tworzenie pierwszego żądania do interfejsu API

Gdy rozszerzenie ma odpowiednie uprawnienia i dane logowania oraz może autoryzować użytkownika Google, może żądać danych za pomocą interfejsu People API. Zaktualizuj kod w aplikacji oauth.js, aby był zgodny z poniższym kodem.

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 powinno rejestrować obiekt JSON zawierający tablicę people/account_id w polu memberResourceNames.

Blokuj twarze

Gdy rozszerzenie zwraca listę kontaktów użytkownika, może wysłać dodatkowe żądania odzyskania profili i informacji tych kontaktów . Rozszerzenie będzie pobierać informacje o zdjęciach kontaktów użytkownika za pomocą memberResourceNames. Zaktualizuj oauth.js, aby zawierał poniższy 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 rozszerzenie i wróć do rozszerzenia. Kliknij przycisk Sieć znajomych i dokończ! Oglądaj twarze kontaktów w jednym bloku.

twarze kontaktów w bloku,