OAuth2: uwierzytelnianie użytkowników za pomocą 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. Rozszerzenia nie ładują się przez HTTPS, więc nie mogą działać 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.

Pełne rozszerzenie można pobrać tutaj.

manifest.json

Dodaj plik manifestu. W tym celu utwórz plik o nazwie manifest.json i dodaj ten kod. lub możesz go pobrać tutaj.

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 2,
  "browser_action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  }
}

background.js

Dodaj skrypt działający w tle. W tym celu utwórz plik o nazwie background.js i dodaj ten kod. Możesz też pobrać plik stąd.

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

index.html

Dodaj plik HTML o nazwie index.html i uwzględnij poniższy kod. Możesz też pobrać plik stąd.

<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>

Prześlij 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 Wybierz plik, wybierz katalog rozszerzenia .zip i go prześlij.
  3. Bez wypełniania dodatkowych pól wybierz Zapisz wersję roboczą i wróć do panelu.

Znajdź rozszerzenie w sekcji Twoje informacje o produktach i kliknij Więcej informacji. Z wyskakującego okienka skopiuj klucz publiczny i dodaj go do pliku manifestu w rozpakowanym katalogu w polu "key".

{
  "name": "OAuth Tutorial FaceBlcok",
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8G...AQAB"
}

Porównaj identyfikatory

Otwórz stronę Zarządzanie rozszerzeniami na chrome://extensions, sprawdź, czy włączony jest tryb programisty, 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 rozszerzenia pasuje we wszystkich miejscach

Rozszerzenie zachowa ten sam identyfikator, ponieważ umieścisz w pliku manifestu pole "key". Zachowanie pojedynczy identyfikator jest niezbędny do rejestracji interfejsu API.

Tworzenie identyfikatora 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 Utwórz identyfikator klienta wybierz Aplikacja 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 FaceBlcok",
  ...
  "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. Lub pobierz go tutaj.

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 w kontaktach „FriendBlock” 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 FaceBlcok",
  ...
  "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.

Utwórz pierwsze żądanie 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