Uwierzytelnianie użytkowników

Protokoły uwierzytelniania internetowego korzystają z funkcji HTTP, ale Aplikacje Chrome działają wewnątrz kontenera aplikacji i nie ładują się przez HTTP, nie mogą też wykonywać przekierowań ani ustawiać plików cookie.

Użyj Chrome Identity API do uwierzytelniania użytkowników: getAuthToken dla użytkowników zalogowanych na swoje konto Google i launchWebAuthFlow dla użytkowników zalogowanych na konto spoza Google. Jeśli Twoja aplikacja używa własnego serwera do uwierzytelniania użytkowników, musisz użyć tego ostatniego.

Jak to działa

Użytkownicy aplikacji w Chrome mają powiązane z kontem konto Google. Aplikacje mogą uzyskiwać tokeny OAuth2 dla tych użytkowników za pomocą interfejsu API getAuthToken.

Aplikacje, które chcą przeprowadzić uwierzytelnianie za pomocą dostawców tożsamości innych niż Google, muszą wywołać funkcję launchWebAuthFlow. Ta metoda wykorzystuje wyskakujące okienko przeglądarki do wyświetlania stron dostawcy i przechwytywania przekierowań do określonych wzorców adresów URL. Przekierowanie są przekazywane do aplikacji, która wyodrębnia z niego token.

Uwierzytelnianie konta Google

Oto 5 krok'w, które musisz wykonać:

  1. Dodaj uprawnienia do pliku manifestu i prześlij aplikację.
  2. Skopiuj klucz z zainstalowanego manifest.json do pliku manifestu źródłowego, aby identyfikator aplikacji był stały podczas tworzenia.
  3. Uzyskaj identyfikator klienta OAuth2 dla aplikacji Chrome.
  4. Zaktualizuj plik manifestu, aby zawierał identyfikator klienta i zakresy.
  5. Uzyskaj token uwierzytelniania.

Dodawanie uprawnień i przesyłanie aplikacji

Upewnij się, że uprawnienia dotyczące tożsamości znajdują się w pliku manifestu. Następnie możesz przesłać aplikację na stronę zarządzania aplikacjami i rozszerzeniami (patrz Publikowanie).

"permissions": [
  "identity"
]

Kopiowanie klucza do pliku manifestu

Podczas rejestrowania aplikacji w konsoli Google OAuth podajesz jej identyfikator, który jest sprawdzany podczas żądań tokenów. Dlatego podczas tworzenia aplikacji należy używać spójnego identyfikatora aplikacji.

Aby identyfikator aplikacji był stały, musisz skopiować klucz z zainstalowanego elementu manifest.json do źródłowego pliku manifestu. Nie jest to najprzyjemniejsze zadanie, ale oto jak to zrobić:

  1. Otwórz katalog danych użytkownika. Przykład na MacOs:~/Library/Application\ Support/Google/Chrome/Default/Extensions
  2. Wymień zainstalowane aplikacje i rozszerzenia oraz dopasuj identyfikator aplikacji na stronie zarządzania aplikacjami i rozszerzeniami do tego samego identyfikatora tutaj.
  3. Otwórz katalog zainstalowanej aplikacji (będzie to wersja w identyfikatorze aplikacji). Otwórz zainstalowany program manifest.json (pico to szybki sposób otwierania pliku).
  4. Skopiuj „klucz” w zainstalowanym pliku manifest.json i wklej go do pliku źródłowego pliku manifestu aplikacji.

Pobieranie identyfikatora klienta OAuth2

Aby uzyskać identyfikator klienta, musisz zarejestrować aplikację w Konsoli interfejsów API Google:

  1. Zaloguj się w Konsoli interfejsów API Google przy użyciu tego samego konta Google, którego użyto do przesłania aplikacji do Chrome Web Store.
  2. Utwórz nowy projekt, rozwijając menu w lewym górnym rogu i klikając element menu Utwórz….
  3. Po utworzeniu i nazwaniu przejdź do menu nawigacyjnego „Usługi” i włącz wszelkie usługi Google, których potrzebuje Twoja aplikacja.
  4. Otwórz pozycję menu „Dostęp do interfejsu API” i kliknij niebieski przycisk Utwórz identyfikator klienta OAuth 2.0.
  5. Wpisz wymagane informacje o markowaniu i wybierz typ Zainstalowana aplikacja.
  6. Wybierz Aplikacja Chrome i wpisz identyfikator aplikacji (ten sam identyfikator jest wyświetlany na stronie zarządzania aplikacjami i rozszerzeniami).

Zaktualizuj plik manifestu, podając identyfikator klienta OAuth2 i zakresy

Musisz zaktualizować plik manifestu, aby zawierał identyfikator klienta i zakresy. Oto przykład „oauth2” w pliku gdrive.py:

"oauth2": {
    "client_id": "665859454684.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/drive"
    ]
  }

Uzyskiwanie tokenów dostępu

Teraz możesz uzyskać token uwierzytelniający, wywołując funkcję identity.getAuthToken.

chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
  // Use the token.
});

Interakcja użytkownika

Podczas wywoływania getAuthToken możesz przekazać flagę ('interactive': true w przykładzie powyżej), która wskazuje, czy interfejs API ma być wywoływany w trybie interaktywnym, czy cichym. Jeśli wywołasz interfejs API w trybie interaktywnym, w razie potrzeby użytkownik zobaczy interfejs logowania lub zatwierdzenia, jak pokazano na zrzucie ekranu poniżej:

Zrzut ekranu pokazujący interfejs, gdy aplikacja używa interfejsu Identity API do uwierzytelniania konta Google

Jeśli wywołasz interfejs API w trybie cichym, zwróci on token tylko wtedy, gdy będzie można go wygenerować bez wyświetlania interfejsu użytkownika. Jest to przydatne np. wtedy, gdy aplikacja wykonuje proces podczas uruchamiania, lub w ogóle, gdy użytkownik nie wykonuje gestu.

Sprawdzoną metodą jest używanie trybu cichego, gdy użytkownik nie wykonuje żadnych gestów, oraz trybu interaktywnego, gdy użytkownik wykonuje gest (np. klika w aplikacji przycisk Zaloguj się). Pamiętaj, że nie wymagamy stosowania żadnych gestów.

Pamięć podręczna

Chrome ma pamięć podręczną z tokenami dostępu, więc możesz wywoływać funkcję getAuthToken w każdej chwili, gdy chcesz użyć tokena. Wygaśnięcie tokenu jest obsługiwane automatycznie przez pamięć podręczną.

Bieżący stan pamięci podręcznej tokenów możesz sprawdzić na stronie chrome://identity-internals.

W niektórych przypadkach, na przykład wtedy, gdy użytkownik zmieni hasło, tokeny dostępu, które wygasły, przestaną działać. Wywołania interfejsu API korzystające z tokena zaczną zwracać kod stanu HTTP 401. Jeśli wykryjesz, że tak się stało, możesz usunąć nieprawidłowy token z pamięci podręcznej Chrome, wywołując funkcję identity.removeCachedAuthToken.

Przykład użycia removeCachedAuthToken:

// callback = function (error, httpStatus, responseText);
function authenticatedXhr(method, url, callback) {
  var retry = true;
  function getTokenAndXhr() {
    chrome.identity.getAuthToken({/* details */},
                                 function (access_token) {
      if (chrome.runtime.lastError) {
        callback(chrome.runtime.lastError);
        return;
      }

      var xhr = new XMLHttpRequest();
      xhr.open(method, url);
      xhr.setRequestHeader('Authorization',
                           'Bearer ' + access_token);

      xhr.onload = function () {
        if (this.status === 401 && retry) {
          // This status may indicate that the cached
          // access token was invalid. Retry once with
          // a fresh token.
          retry = false;
          chrome.identity.removeCachedAuthToken(
              { 'token': access_token },
              getTokenAndXhr);
          return;
        }

        callback(null, this.status, this.responseText);
      }
    });
  }
}

Uwierzytelnianie przy użyciu konta spoza Google

Musisz wykonać 3 kroki:

  1. Zarejestruj się u dostawcy.
  2. Dodaj uprawnienia do zasobów dostawcy, do których będzie mieć dostęp Twoja aplikacja.
  3. Pobierz token uwierzytelniania.

Rejestracja u dostawcy

Musisz zarejestrować u dostawcy identyfikator klienta OAuth2 i skonfigurować go jako witrynę. W przypadku identyfikatora URI przekierowania wpisywanego podczas rejestracji użyj adresu URL w tym formacie:https://<extension-id>.chromiumapp.org/<anything-here>

Jeśli na przykład identyfikator Twojej aplikacji to abcdefghijklmnopqrstuvwxyzabcdef i chcesz, by ścieżkę o nazwie provider_cb stanowiła ścieżka, aby odróżnić ją od identyfikatorów URI przekierowania od innych dostawców, użyj: https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb

Dodawanie uprawnień dla dostawcy

Aby utworzyć żądania XHR z innych domen do punktów końcowych interfejsu API dostawcy, musisz dodać odpowiednie wzorce do listy dozwolonych w uprawnieniach:

"permissions": [
  ...
  "https://www.website-of-provider-with-user-photos.com/photos/*"
]

Pobieranie tokena

Aby uzyskać token:

chrome.identity.launchWebAuthFlow(
  {'url': '<url-to-do-auth>', 'interactive': true},
  function(redirect_url) { /* Extract token from redirect_url */ });

<url-to-do-auth> to dowolny adres URL służący do uwierzytelniania w witrynie dostawcy. Załóżmy, że wykonujesz proces OAuth2 z dostawcą i zarejestrujesz swoją aplikację z identyfikatorem klienta 123456789012345 i chcesz uzyskać dostęp do zdjęć użytkownika na stronie dostawcy:https://www.website-of-provider-with-user-photos.com/dialog/oauth?client_id=123456789012345& redirect_uri=https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb&response_type=token&scope=user_photos

Dostawca przeprowadzi uwierzytelnianie i, w stosownych przypadkach, wyświetli użytkownikowi interfejs logowania lub zatwierdzenia. Następnie nastąpi przekierowanie do witryny https://abcdefghijklmnopqrstuvwxyzabcdef.chromiumapp.org/provider_cb#authToken=<auth-token>

Chrome przechwyci to i wywoła wywołanie zwrotne aplikacji z pełnym adresem URL przekierowania. Aplikacja powinna wyodrębnić token z adresu URL.

Tryb interaktywny a tryb cichy

Podczas wywoływania metody launchWebAuthFlow możesz przekazać flagę (w tym przykładzie 'interactive': true) wskazującą, czy interfejs API ma być wywoływany w trybie interaktywnym (czyli w trybie cichym). Jeśli wywołasz interfejs API w trybie interaktywnym, użytkownikowi zostanie wyświetlony interfejs (np. interfejs logowania lub zatwierdzania) umożliwiający uzyskanie tokena.

Jeśli wywołujesz interfejs API w trybie cichym, zwraca on token tylko wtedy, gdy dostawca jest w stanie dostarczyć token bez wyświetlania żadnego interfejsu użytkownika. Jest to przydatne np. wtedy, gdy aplikacja wykonuje proces podczas uruchamiania aplikacji, lub w ogóle, gdy użytkownik nie wykonuje gestu.

Sprawdzoną metodą jest korzystanie z trybu cichego, gdy użytkownik nie wykonuje gestu, oraz używanie trybu interaktywnego w przypadku gestu użytkownika (np. kliknięcia przycisku Zaloguj się w aplikacji). Pamiętaj, że nie wymagamy stosowania gestów.