Przegląd
Oparte na protokole OAuth łączenie z użyciem protokołu OAuth dodaje funkcję Logowanie przez OAuth. Ułatwia to użytkownikom łączenie się z Google, a także umożliwia tworzenie kont, które pozwalają użytkownikom tworzyć nowe konta w usłudze za pomocą konta Google.
Aby połączyć konto przez OAuth i logowanie przez Google, wykonaj te ogólne czynności:
- Najpierw poproś użytkownika o zgodę na dostęp do jego profilu Google.
- Sprawdź w profilu, czy konto użytkownika istnieje.
- Jeśli jesteś już użytkownikiem, połącz konta.
- Jeśli nie możesz znaleźć dopasowania użytkownika Google do swojego systemu uwierzytelniania, sprawdź token tożsamości otrzymany od Google. Następnie możesz utworzyć konto użytkownika na podstawie informacji o profilu zawartych w tokenie identyfikatora.
![Ilustracja przedstawiająca kroki, jakie musi wykonać użytkownik, aby połączyć swoje konto Google przy użyciu uproszczonego procesu łączenia. Pierwszy zrzut ekranu pokazuje, jak użytkownik może wybrać Twoją aplikację do połączenia. Drugi zrzut ekranu pozwala użytkownikowi sprawdzić, czy ma już konto w usłudze. Trzeci zrzut ekranu pozwala użytkownikowi wybrać konto Google, które chce połączyć. Czwarty zrzut ekranu przedstawia potwierdzenie połączenia konta Google z aplikacją. Piąty zrzut ekranu przedstawia połączone konto użytkownika w aplikacji Google.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/account-linking/images/streamlined-linking-flow.png?authuser=8&hl=pl)
Rysunek 1. Łączenie kont na telefonie użytkownika dzięki uproszczonemu łączeniu
Wymagania dotyczące płynnego łączenia
- Zaimplementuj prosty proces łączenia przez OAuth. Twoja usługa musi obsługiwać punkty końcowe autoryzacji i giełdy tokenów zgodnej z protokołem OAuth 2.0.
- Punkt końcowy token giełdy musi obsługiwać tokeny JSON Web Token (JWT) oraz implementować intencje
check
,create
iget
.
Implementowanie serwera OAuth
Punkt końcowy tokena giełdy musi obsługiwać intencje check
, create
i get
. Poniżej znajdziesz instrukcje wykonane podczas łączenia kont oraz wskazówki dotyczące wywołania różnych intencji:
- Czy użytkownik ma konto w systemie uwierzytelniania? (Użytkownik decyduje o treści TAK lub NIE)
- TAK : Czy użytkownik używa adresu e-mail powiązanego z kontem Google, by logować się na Twojej platformie? (Użytkownik decyduje o treści TAK lub NIE)
- TAK : Czy użytkownik ma pasujące konto w systemie uwierzytelniania? (
check intent
zawiera prośbę o potwierdzenie)- TAK : narzędzie
get intent
jest wywoływane, a konto jest połączone, jeśli intencja zwróci się. - NIE : utworzyć nowe konto? (Użytkownik decyduje o treści TAK lub NIE)
- TAK: narzędzie
create intent
jest wywoływane, a konto jest połączone, jeśli intencja skutecznie zwróci intencję. - NIE : użytkownik uruchomi proces protokołu OAuth, użytkownik zostanie przekierowany do przeglądarki, a użytkownik będzie mógł połączyć się z innym adresem e-mail.
- TAK: narzędzie
- TAK : narzędzie
- NIE : użytkownik wywołał proces Web OAuth, użytkownik został przekierowany do przeglądarki, a użytkownik mógł połączyć się z innym adresem e-mail.
- TAK : Czy użytkownik ma pasujące konto w systemie uwierzytelniania? (
- NIE : Czy użytkownik ma pasujące konto w systemie uwierzytelniania? (
check intent
zawiera prośbę o potwierdzenie)- TAK : narzędzie
get intent
jest wywoływane, a konto jest połączone, jeśli intencja zwróci się. - NIE : wywoływany jest element
create intent
, a konto jest połączone, jeśli intencja utworzenia się uda.
- TAK : narzędzie
- TAK : Czy użytkownik używa adresu e-mail powiązanego z kontem Google, by logować się na Twojej platformie? (Użytkownik decyduje o treści TAK lub NIE)
Check for an existing user account (check intent)
After the user gives consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.
If the corresponding Google account is already present in your authentication
system, your token exchange endpoint responds with account_found=true
. If the
Google account doesn't match an existing user, your token exchange endpoint
returns an HTTP 404 Not Found error with account_found=false
.
The request has the following form:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Your token exchange endpoint must be able to handle the following parameters:
Token endpoint parameters | |
---|---|
intent |
For these requests, the value of this parameter is
check . |
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion |
A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address. |
client_id |
The client ID you assigned to Google. |
client_secret |
The client secret you assigned to Google. |
To respond to the check
intent requests, your token exchange endpoint must perform the following steps:
- Validate and decode the JWT assertion.
- Check if the Google account is already present in your authentication system.
Validate and decode the JWT assertion
You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys, available in JWK or PEM formats, to verify the token's signature.
When decoded, the JWT assertion looks like the following example:
{ "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 }
In addition to verifying the token's signature, verify that the assertion's
issuer (iss
field) is https://accounts.google.com
, that the audience
(aud
field) is your assigned client ID, and that the token has not expired
(exp
field).
Using the email
, email_verified
and hd
fields you can determine if
Google hosts and is authoritative for an email address. In cases where Google is
authoritative the user is currently known to be the legitimate account owner
and you may skip password or other challenges methods. Otherwise, these methods
can be used to verify the account prior to linking.
Cases where Google is authoritative:
email
has a@gmail.com
suffix, this is a Gmail account.email_verified
is true andhd
is set, this is a G Suite account.
Users may register for Google Accounts without using Gmail or G Suite. When
email
does not contain a @gmail.com
suffix and hd
is absent Google is not
authoritative and password or other challenge methods are recommended to verify
the user. email_verified
can also be true as Google initially verified the
user when the Google account was created, however ownership of the third party
email account may have since changed.
Check if the Google account is already present in your authentication system
Check whether either of the following conditions are true:
- The Google Account ID, found in the assertion's
sub
field, is in your user database. - The email address in the assertion matches a user in your user database.
If either condition is true, the user has already signed up. In that case, return a response like the following:
HTTP/1.1 200 Success Content-Type: application/json;charset=UTF-8 { "account_found":"true", }
If neither the Google Account ID nor the email address specified in the
assertion matches a user in your database, the user hasn't signed up yet. In
this case, your token exchange endpoint needs to reply with a HTTP 404 error
that specifies "account_found": "false"
, as in the following example:
HTTP/1.1 404 Not found Content-Type: application/json;charset=UTF-8 { "account_found":"false", }
Obsługa automatycznego łączenia (pobieranie intencji)
Gdy użytkownik wyrazi zgodę na dostęp do jego profilu Google, Google wyśle żądanie zawierające podpisane potwierdzenie tożsamości użytkownika Google. Potwierdzenie zawiera informacje, które obejmują identyfikator konta Google, nazwę użytkownika oraz adres e-mail użytkownika. Punkt końcowy wymiany tokenów skonfigurowany dla Twojego projektu obsługuje to żądanie.
Jeśli odpowiednie konto Google jest już obecne w Twoim systemie uwierzytelniania, punkt końcowy wymiany tokenów zwraca token dla użytkownika. Jeśli konto Google nie jest zgodne z istniejącym użytkownikiem, punkt końcowy wymiany tokenów zwraca błąd linking_error
i opcjonalny login_hint
.
Prośba ma następującą postać:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Punkt końcowy wymiany tokenów musi mieć możliwość obsługi następujących parametrów:
Parametry punktu końcowego tokena | |
---|---|
intent |
W przypadku tych żądań wartość tego parametru wynosi get . |
grant_type |
Typ wymienianego tokena. W przypadku tych żądań ten parametr ma wartość urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion |
Token internetowy JSON (JWT) zapewniający podpisane potwierdzenie tożsamości użytkownika Google. Token JWT zawiera informacje takie jak identyfikator konta Google, nazwa użytkownika i adres e-mail użytkownika. |
scope |
Opcjonalnie: wszystkie zakresy skonfigurowane przez Google pod kątem żądań użytkowników. |
client_id |
Identyfikator klienta przypisany do Google. |
client_secret |
Tajny klucz klienta przypisany do Google. |
Aby odpowiedzieć na żądania dotyczące intencji get
, Twój punkt końcowy wymiany tokenów musi wykonać te czynności:
- Zweryfikuj i odkoduj potwierdzenie tokena JWT.
- Sprawdź, czy konto Google znajduje się już w Twoim systemie uwierzytelniania.
Validate and decode the JWT assertion
You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys, available in JWK or PEM formats, to verify the token's signature.
When decoded, the JWT assertion looks like the following example:
{ "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 }
In addition to verifying the token's signature, verify that the assertion's
issuer (iss
field) is https://accounts.google.com
, that the audience
(aud
field) is your assigned client ID, and that the token has not expired
(exp
field).
Using the email
, email_verified
and hd
fields you can determine if
Google hosts and is authoritative for an email address. In cases where Google is
authoritative the user is currently known to be the legitimate account owner
and you may skip password or other challenges methods. Otherwise, these methods
can be used to verify the account prior to linking.
Cases where Google is authoritative:
email
has a@gmail.com
suffix, this is a Gmail account.email_verified
is true andhd
is set, this is a G Suite account.
Users may register for Google Accounts without using Gmail or G Suite. When
email
does not contain a @gmail.com
suffix and hd
is absent Google is not
authoritative and password or other challenge methods are recommended to verify
the user. email_verified
can also be true as Google initially verified the
user when the Google account was created, however ownership of the third party
email account may have since changed.
Sprawdź, czy konto Google znajduje się już w Twoim systemie uwierzytelniania
Sprawdź, czy spełniony jest jeden z tych warunków:
- Identyfikator konta Google, który znajduje się w polu
sub
potwierdzenia, znajduje się w Twojej bazie danych użytkowników. - Adres e-mail w potwierdzeniu znajduje się w bazie danych użytkownika.
Jeśli użytkownik znajdzie konto, wygeneruj token dostępu i zwróć wartości w obiekcie JSON w treści odpowiedzi HTTPS, tak jak w tym przykładzie:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
W niektórych przypadkach może się zdarzyć, że połączenie kont na podstawie tokena tożsamości stanie się niemożliwe. Jeśli tak jest, Twój punkt końcowy wymiany tokenów musi odpowiedzieć z błędem HTTP 401, który określa error=linking_error
, jak pokazano w poniższym przykładzie:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"linking_error", "login_hint":"foo@bar.com" }
Gdy Google otrzyma odpowiedź z komunikatem o błędzie 401 z parametrem linking_error
, wyśle użytkownika do Twojego punktu końcowego autoryzacji z parametrem login_hint
. Użytkownik kończy łączenie kont, korzystając z połączenia OAuth w przeglądarce.
Handle account creation via Google Sign-In (create intent)
When a user needs to create an account on your service, Google makes a request
to your token exchange endpoint that specifies intent=create
.
The request has the following form:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT&client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET
Your token exchange endpoint must able to handle the following parameters:
Token endpoint parameters | |
---|---|
intent |
For these requests, the value of this parameter is create . |
grant_type |
The type of token being exchanged. For these requests, this
parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer . |
assertion |
A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address. |
client_id |
The client ID you assigned to Google. |
client_secret |
The client secret you assigned to Google. |
The JWT within the assertion
parameter contains the user's Google Account ID,
name, and email address, which you can use to create a new account on your
service.
To respond to the create
intent requests, your token exchange endpoint must perform the following steps:
- Validate and decode the JWT assertion.
- Validate user information and create new account.
Validate and decode the JWT assertion
You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys, available in JWK or PEM formats, to verify the token's signature.
When decoded, the JWT assertion looks like the following example:
{ "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 }
In addition to verifying the token's signature, verify that the assertion's
issuer (iss
field) is https://accounts.google.com
, that the audience
(aud
field) is your assigned client ID, and that the token has not expired
(exp
field).
Using the email
, email_verified
and hd
fields you can determine if
Google hosts and is authoritative for an email address. In cases where Google is
authoritative the user is currently known to be the legitimate account owner
and you may skip password or other challenges methods. Otherwise, these methods
can be used to verify the account prior to linking.
Cases where Google is authoritative:
email
has a@gmail.com
suffix, this is a Gmail account.email_verified
is true andhd
is set, this is a G Suite account.
Users may register for Google Accounts without using Gmail or G Suite. When
email
does not contain a @gmail.com
suffix and hd
is absent Google is not
authoritative and password or other challenge methods are recommended to verify
the user. email_verified
can also be true as Google initially verified the
user when the Google account was created, however ownership of the third party
email account may have since changed.
Validate user information and create new account
Check whether either of the following conditions are true:
- The Google Account ID, found in the assertion's
sub
field, is in your user database. - The email address in the assertion matches a user in your user database.
If either condition is true, prompt the user to link their existing account
with their Google Account. To do so, respond to the request with an HTTP 401 error
that specifies error=linking_error
and gives the user's email address as the
login_hint
. The following is a sample response:
HTTP/1.1 401 Unauthorized Content-Type: application/json;charset=UTF-8 { "error":"linking_error", "login_hint":"foo@bar.com" }
When Google receives a 401 error response with linking_error
, Google sends
the user to your authorization endpoint with login_hint
as a parameter. The
user completes account linking using the OAuth linking flow in their browser.
If neither condition is true, create a new user account with the information provided in the JWT. New accounts don't typically have a password set. It's recommended that you add Google Sign-In to other platforms to enable users to log in with Google across the surfaces of your application. Alternatively, you can email the user a link that starts your password recovery flow to allow the user to set a password to sign in on other platforms.
When the creation is completed, issue an access token and return the values in a JSON object in the body of your HTTPS response, like in the following example:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Uzyskiwanie identyfikatora klienta Google API
Podczas rejestracji konta musisz podać identyfikator klienta Google API.
Aby uzyskać identyfikator klienta API, użyj projektu utworzonego podczas wykonywania kroków łączenia OAuth. Aby to zrobić:
- Otwórz stronę Dane logowania w konsoli interfejsu API Google.
Utwórz lub wybierz projekt interfejsów API Google.
Jeśli Twój projekt nie ma identyfikatora klienta dla typu aplikacji internetowej, kliknij Utwórz dane logowania i identyfikator klienta OAuth, by go utworzyć. Pamiętaj, aby w polu Autoryzowane źródła JavaScript umieścić domenę swojej witryny. Podczas wykonywania testów lokalnych lub programowania należy dodać zarówno pole
http://localhost
, jak ihttp://localhost:<port_number>
w polu Autoryzowane źródła JavaScript.
Sprawdzanie poprawności implementacji
Można sprawdzić poprawność implementacji za pomocą OAuth 2.0 Playground narzędzia.
W narzędziu wykonaj następujące czynności:
- Kliknij konfiguracji , aby otworzyć okno konfiguracji OAuth 2.0.
- W dziedzinie przepływu OAuth, wybierz Client-side.
- W polu OAuth Endpoints wybierz Niestandardowy.
- W odpowiednich polach określ punkt końcowy OAuth 2.0 i identyfikator klienta przypisany do Google.
- W sekcji Krok 1, nie zaznaczaj żadnych zakresów Google. Zamiast tego pozostaw to pole puste lub wpisz zakres poprawny dla Twojego serwera (lub dowolny ciąg, jeśli nie używasz zakresów OAuth). Kiedy skończysz, kliknij autoryzacji API.
- W etapie 2 i etapem 3 części, przechodzą przepływu OAuth 2.0 i upewnić się, że każdy etap działa zgodnie z zamierzeniem.
Można sprawdzić poprawność implementacji za pomocą konta Google Linking Demo narzędzia.
W narzędziu wykonaj następujące czynności:
- Kliknij Sign-in z przycisku Google.
- Wybierz konto, które chcesz połączyć.
- Wprowadź identyfikator usługi.
- Opcjonalnie wprowadź co najmniej jeden zakres, do którego poprosisz o dostęp.
- Kliknij Start Demo.
- Po wyświetleniu monitu potwierdź, że możesz wyrazić zgodę i odrzucić prośbę o połączenie.
- Potwierdź, że zostałeś przekierowany na swoją platformę.