Logowanie na powiązane konto

Połączenie z kontem Google pozwala właścicielom kont Google szybko, bezproblemowo i bezpiecznie łączyć się z Twoimi usługami oraz udostępniać dane Google.

Logowanie na powiązane konto włącza logowanie jednym dotknięciem przez Google w przypadku użytkowników, którzy mają już połączone konta Google z Twoją usługą. Zwiększa to wygodę użytkowników, ponieważ mogą logować się jednym kliknięciem bez konieczności ponownego wpisywania nazwy użytkownika i hasła. Zmniejsza to też szanse na to, że użytkownicy będą tworzyć zduplikowane konta w Twojej usłudze.

Wymagania

Aby wdrożyć logowanie na połączone konto, musisz spełniać następujące wymagania:

Jak to działa

Warunek wstępny : użytkownik wcześniej połączył swoje konto Google z kontem w Twojej usłudze.

  1. Wyrażasz zgodę na wyświetlanie połączonych kont podczas logowania się jednym dotknięciem.
  2. Użytkownik widzi prośbę o zalogowanie się jednym dotknięciem z opcją zalogowania się w Twojej usłudze za pomocą połączonego konta.
  3. Jeśli użytkownik zdecyduje się kontynuować korzystanie z połączonego konta, Google wyśle do punktu końcowego tokena żądanie zapisania kodu autoryzacji. Żądanie zawiera token dostępu użytkownika wydany przez Twoją usługę oraz kod autoryzacji Google.
  4. Wymień kod autoryzacji Google na token identyfikatora Google, który zawiera informacje o koncie Google użytkownika.
  5. Aplikacja również otrzymuje token identyfikatora po zakończeniu procesu, który dopasowuje go do identyfikatora użytkownika w tokenie identyfikatora otrzymanym przez serwer, aby zalogować użytkownika w aplikacji.
Logowanie na powiązane konto.
Rysunek 1. Proces logowania na połączone konto. Jeśli użytkownik korzysta z kilku kont na swoim urządzeniu, może zobaczyć funkcję wyboru konta i przejść do widoku Logowanie na powiązane konto tylko wtedy, gdy wybierze powiązane konto.

Wdrażanie logowania do połączonego konta w aplikacji na Androida

Aby obsługiwać logowanie się na połączone konto w aplikacji na Androida, postępuj zgodnie z instrukcjami w przewodniku po implementacji na Androidzie.

Obsługa żądań kodu autoryzacji od Google

Google wysyła żądanie POST do punktu końcowego tokena, aby zapisać kod autoryzacji, który wymienisz na token identyfikatora użytkownika. Żądanie zawiera token dostępu użytkownika i kod autoryzacji OAuth2 wydany przez Google.

Zanim zapiszesz kod autoryzacji, sprawdź, czy token dostępu został przez Ciebie przyznany Google. Token ten zawiera client_id.

Żądanie HTTP

Przykładowe żądanie

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

Punkt końcowy wymiany tokenów musi obsługiwać te parametry żądania:

Parametry punktu końcowego tokena
code Wymagany kod autoryzacji Google OAuth2
client_id Wymagany identyfikator klienta przekazany Google.
client_secret Wymagany tajny klucz klienta przekazany Google
access_token Wymagany token dostępu, który został wystawiony przez Ciebie dla Google. Dzięki temu poznasz kontekst użytkownika
grant_type Wymagana Wartość MUSI być ustawiona na urn:ietf:params:oauth:grant-type:reciprocal.

Punkt końcowy wymiany tokenów powinien odpowiadać na żądanie POST w ten sposób:

  • Sprawdź, czy dokument access_token został przekazany Google zidentyfikowany przez client_id.
  • Jeśli żądanie jest prawidłowe, a kod autoryzacji został wymieniony na token identyfikatora Google, prześlij odpowiedź HTTP 200 (OK) lub kod błędu HTTP, jeśli żądanie jest nieprawidłowe.

Odpowiedź HTTP

Gotowe

Zwracanie kodu stanu HTTP 200 OK

Przykładowa odpowiedź o powodzeniu
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Błędy

W przypadku nieprawidłowego żądania HTTP wyślij odpowiedź z jednego z tych kodów błędu HTTP:

Kod stanu HTTP Treść Opis
400 {"error": "invalid_request"} W żądaniu brakuje parametru, więc serwer nie może go zrealizować. Ten kod może być też zwracany, jeśli żądanie zawiera nieobsługiwany parametr lub powtarza parametr
401 {"error": "invalid_request"} Uwierzytelnianie klienta się nie udało, na przykład jeśli żądanie zawiera nieprawidłowy identyfikator lub tajny klucz klienta
401 {"error": "invalid_token"}

Umieść test uwierzytelniania „WWW-Authentication: Bearer” w nagłówku odpowiedzi

Token dostępu partnera jest nieprawidłowy.
403 {"error": "insufficient_permission"}

Umieść test uwierzytelniania „WWW-Authentication: Bearer” w nagłówku odpowiedzi

Token dostępu partnera nie zawiera zakresów niezbędnych do wykonania wzajemnego protokołu OAuth
500 {"error": "internal_error"} Błąd serwera

Odpowiedź o błędzie powinna zawierać te pola :

Pola odpowiedzi na błędy
error Wymagany – ciąg znaków błędu
error_description zrozumiały dla człowieka opis błędu;
error_uri Identyfikator URI zawierający więcej informacji o błędzie
Przykładowy błąd 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Wymiana kodu autoryzacji dla tokena identyfikatora

Musisz wymienić otrzymany kod autoryzacji na token identyfikatora Google, który zawiera informacje o koncie Google użytkownika.

Aby wymienić kod autoryzacji na token identyfikatora Google, wywołaj punkt końcowy https://oauth2.googleapis.com/token i ustaw te parametry:

Pola żądania
client_id Wymagany: identyfikator klienta uzyskany ze strony Dane logowania w Konsoli interfejsów API. Zwykle są to dane logowania o nazwie Nowe działania w aplikacji Actions on Google.
client_secret Wymagany: tajny klucz klienta uzyskany ze strony Dane logowania w konsoli API.
code Wymagany – kod autoryzacji wysłany w pierwszym żądaniu.
grant_type Wymagane Zgodnie ze specyfikacją OAuth 2.0 wartość tego pola musi być ustawiona na authorization_code.
Przykładowe żądanie
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

Google w odpowiedzi na to żądanie zwraca obiekt JSON zawierający token dostępu o ograniczonym czasie ważności i token odświeżania.

Odpowiedź zawiera te pola:

Pola odpowiedzi
access_token Token dostępu wydany przez Google, który Twoja aplikacja wysyła w celu autoryzacji żądania do interfejsu API Google.
id_token Token identyfikatora zawiera informacje o koncie Google użytkownika. Sekcja Weryfikowanie odpowiedzi zawiera szczegółowe informacje o dekodowaniu i weryfikowaniu odpowiedzi tokena identyfikatora.
expires_in Pozostały czas życia tokena dostępu w sekundach
refresh_token Token, za pomocą którego można uzyskać nowy token dostępu. Tokeny odświeżania są ważne do momentu unieważnienia dostępu przez użytkownika
scope W przypadku logowania na połączone konto wartość tego pola jest zawsze ustawiona na openid
token_type Typ zwracanego tokena. Obecnie wartość tego pola jest zawsze ustawiona na Bearer
Przykładowa odpowiedź
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Weryfikowanie odpowiedzi tokena identyfikatora

Sprawdź poprawność i zdekoduj asercję JWT

Potwierdzenie JWT można sprawdzić i zdekodować, używając biblioteki dekodującej JWT dla swojego języka . Użyj kluczy publicznych Google, dostępnych w formatach JWK lub PEM , aby zweryfikować podpis tokena.

Po zdekodowaniu asercja JWT wygląda jak w następującym przykładzie:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Oprócz weryfikacji podpisu tokena sprawdź, czy wystawca potwierdzenia (pole iss ) to https://accounts.google.com , czy odbiorca (pole aud ) to przypisany przez Ciebie identyfikator klienta oraz czy token nie wygasł ( exp pole).

Korzystając z pól email , email_verified i hd możesz określić, czy Google obsługuje adres e-mail i czy jest miarodajny. W przypadkach, gdy Google jest autorytatywnym użytkownikiem, wiadomo, że użytkownik jest prawowitym właścicielem konta i możesz pominąć hasło lub inne metody sprawdzania. W przeciwnym razie te metody mogą służyć do weryfikacji konta przed połączeniem.

Przypadki, w których Google jest autorytatywny:

  • email ma przyrostek @gmail.com , to jest konto Gmail.
  • email_verified ma wartość true i ustawiono hd , to jest konto G Suite.

Użytkownicy mogą rejestrować się na konta Google bez korzystania z Gmaila ani G Suite. Jeśli email nie zawiera sufiksu @gmail.com i nie ma hd Google nie jest autorytatywny i zaleca się podanie hasła lub innych metod sprawdzania tożsamości w celu zweryfikowania użytkownika. email_verfied może również mieć wartość true, ponieważ firma Google wstępnie zweryfikowała użytkownika podczas tworzenia konta Google, jednak własność konta e-mail innej firmy mogła ulec zmianie od tego czasu.