Każda integracja Cloud-to-cloud musi zawierać mechanizm uwierzytelniania użytkowników.
Uwierzytelnianie umożliwia powiązanie kont Google użytkowników z kontami użytkowników w Twoim systemie uwierzytelniania. Dzięki temu możesz identyfikować użytkowników, gdy usługa realizacji otrzyma intencję inteligentnego domu. Inteligentny dom Google obsługuje tylko OAuth z przepływem kodu autoryzacji.
Na tej stronie opisujemy, jak skonfigurować serwer OAuth 2.0, aby działał z integracją Cloud-to-cloud.
Łączenie z kontem Google przy użyciu protokołu OAuth
In the authorization code flow, you need two endpoints:
The authorization endpoint, which presents the sign-in UI to your users that aren't already signed in. The authorization endpoint also creates a short-lived authorization code to record users' consent to the requested access.
The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Design guidelines
This section describes the design requirements and recommendations for the user screen that you host for OAuth linking flows. After it's called by Google's app, your platform displays a sign in to Google page and account linking consent screen to the user. The user is directed back to Google's app after giving their consent to link accounts.
Requirements
- You must communicate that the user’s account will be linked to Google, not a specific Google product like Google Home or Google Assistant.
- You must have a Google authorization statement such as "By signing in, you are authorizing Google to control your devices." See the Google Device Control Authorization section of the Google Home Developer Policies.
- You must open the Web OAuth linking page and ensure users have a clear method for signing in to their Google Account, such as fields for their username and password. Don't use the Google Sign-In (GSI) method that enables users to link without being taken to the Web OAuth Linking page. It is a violation of Google policy.
- You must include at least one of the following items in the OAuth linking
page to indicate the integration to which the user is linking:
- Company logo
- Company name
- Integration name
- App icon
Recommendations
We recommend that you do the following:
Display Google's Privacy Policy. Include a link to Google’s Privacy Policy on the consent screen.
Data to be shared. Use clear and concise language to tell the user what data of theirs Google requires and why, and what usage or interaction data may be shared with you by Google.
Clear call-to-action. State a clear call-to-action on your consent screen, such as “Agree and link.” This is because users need to understand what data they're required to share with Google to link their accounts.
Ability to cancel. Provide a way for users to go back or cancel, if they choose not to link.
Clear sign-in process. Ensure that users have a clear method for signing in to their Google Account, such as fields for their username and password or Sign in with Google.
Ability to unlink. Offer a mechanism for users to unlink, such as a URL to their account settings on your platform. Alternatively, you can include a link to Google Account where users can manage their linked account. If a user unlinks from your integration, use
agentUsers.deleteto notify Google of the change.Ability to change user account. Suggest a method for users to switch their account(s). This is especially beneficial if users tend to have multiple accounts.
- If a user must close the consent screen to switch accounts, send a recoverable error to Google so the user can sign in to the desired account with OAuth linking.
Include your logo. Display your company logo on the consent screen. Use your style guidelines to place your logo. If you wish to also display Google's logo, see Logos and trademarks.
Przepływ kodu autoryzacji
Implementacja serwera OAuth 2.0 z przepływem kodu autoryzacji składa się z 2 punktów końcowych, które Twoja usługa udostępnia przez HTTPS. Pierwszy punkt końcowy to punkt końcowy autoryzacji, który odpowiada za znajdowanie lub uzyskiwanie zgody użytkowników na dostęp do danych. Punkt końcowy autoryzacji wyświetla użytkownikom, którzy nie są jeszcze zalogowani, interfejs logowania i rejestruje zgodę na żądany dostęp. Drugi punkt końcowy to punkt końcowy wymiany tokenów, który służy do uzyskiwania zaszyfrowanych ciągów znaków, zwanych tokenami, które autoryzują użytkownika do korzystania z Twojej usługi.
Gdy aplikacja Google musi wywołać jeden z interfejsów API Twojej usługi, Google używa tych punktów końcowych razem, aby uzyskać od użytkowników zgodę na wywoływanie tych interfejsów API w ich imieniu.
Sesja przepływu kodu autoryzacji OAuth 2.0 zainicjowana przez Google ma następujący przebieg:
- Google otwiera punkt końcowy autoryzacji w przeglądarce użytkownika. Jeśli przepływ został rozpoczęty na urządzeniu obsługującym tylko głos w przypadku działania, Google przenosi wykonanie na telefon.
- Użytkownik loguje się (jeśli nie jest jeszcze zalogowany) i przyznaje Google uprawnienia dostępu do swoich danych za pomocą Twojego interfejsu API, jeśli nie zrobił tego wcześniej.
- Twoja usługa tworzy kod autoryzacji i zwraca go do Google. Aby to zrobić, przekieruj przeglądarkę użytkownika z powrotem do Google, dołączając do żądania kod autoryzacji.
- Google wysyła kod autoryzacji do punktu końcowego wymiany tokenów, który weryfikuje autentyczność kodu i zwraca token dostępu oraz token odświeżania. Token dostępu to token ważny przez krótki czas, który Twoja usługa akceptuje jako dane logowania do interfejsów API. Token odświeżania to token ważny przez długi czas, który Google może przechowywać i używać do uzyskiwania nowych tokenów dostępu, gdy te wygasną.
- Gdy użytkownik zakończy proces łączenia kont, każde kolejne żądanie wysyłane z Google będzie zawierać token dostępu.
Obsługa żądań autoryzacji
Gdy musisz połączyć konta za pomocą przepływu kodu autoryzacji OAuth 2.0, Google wysyła użytkownika do punktu końcowego autoryzacji z żądaniem zawierającym te parametry:
| Parametry punktu końcowego autoryzacji | |
|---|---|
client_id |
Identyfikator klienta przypisany przez Ciebie do Google. |
redirect_uri |
Adres URL, na który wysyłasz odpowiedź na to żądanie. |
state |
Wartość księgowa, która jest przekazywana z powrotem do Google bez zmian w identyfikatorze URI przekierowania. |
scope |
Opcjonalnie: rozdzielony spacjami zestaw ciągów znaków zakresu, które określają dane, do których Google prosi o autoryzację. |
response_type |
Typ wartości, która ma zostać zwrócona w odpowiedzi. W przypadku przepływu kodu autoryzacji OAuth 2.0
typ odpowiedzi jest zawsze code.
|
Jeśli na przykład punkt końcowy autoryzacji jest dostępny pod adresem https://myservice.example.com/auth, żądanie może wyglądać tak:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
Aby punkt końcowy autoryzacji obsługiwał żądania logowania:
- Sprawdź, czy
client_idodpowiada identyfikatorowi klienta przypisanemu przez Ciebie do Google, aredirect_uri– adresowi URL przekierowania podanemu przez Google w przypadku Twojej usługi. Te sprawdzenia są ważne, aby zapobiec przyznaniu dostępu niepożądanym lub nieprawidłowo skonfigurowanym aplikacjom klienckim. Jeśli obsługujesz wiele przepływów OAuth 2.0, sprawdź też, czyresponse_typema wartośćcode. - Sprawdź, czy użytkownik jest zalogowany w Twojej usłudze. Jeśli użytkownik nie jest zalogowany, dokończ proces logowania lub rejestracji w usłudze.
- Wygeneruj kod autoryzacji, którego Google może użyć do uzyskania dostępu do Twojego interfejsu API. Kod autoryzacji może być dowolnym ciągiem znaków, ale musi jednoznacznie reprezentować użytkownika, klienta, dla którego jest przeznaczony token, i czas ważności kodu, a także nie może być łatwy do odgadnięcia. Zwykle wydajesz kody autoryzacji, które wygasają po około 10 minutach.
- Sprawdź, czy adres URL określony przez parametr
redirect_urima następującą postać:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- Przekieruj przeglądarkę użytkownika na adres URL określony przez
redirect_uriparametr. Podczas przekierowania dołącz wygenerowany kod autoryzacji i oryginalną, niezmodyfikowaną wartość stanu, dodając parametrycodeistate. Oto przykład wynikowego adresu URL:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Obsługa żądań wymiany tokenów
Punkt końcowy wymiany tokenów Twojej usługi odpowiada za 2 rodzaje wymiany tokenów:
- Wymiana kodów autoryzacji na tokeny dostępu i tokeny odświeżania.
- Wymiana tokenów odświeżania na tokeny dostępu.
Żądania wymiany tokenów zawierają te parametry:
| Parametry punktu końcowego wymiany tokenów | |
|---|---|
client_id |
Ciąg znaków, który identyfikuje źródło żądania jako Google. Ten ciąg znaków musi być zarejestrowany w Twoim systemie jako unikalny identyfikator Google. |
client_secret |
Tajny ciąg znaków zarejestrowany w Google w przypadku Twojej usługi. |
grant_type |
Typ wymienianego tokena. Może to być
authorization_code lub refresh_token. |
code |
Gdy grant_type=authorization_code, ten parametr jest kodem, który Google otrzymało z Twojego punktu końcowego logowania lub wymiany tokenów. |
redirect_uri |
Gdy grant_type=authorization_code, ten parametr jest
adresem URL używanym w początkowym żądaniu autoryzacji. |
refresh_token |
Gdy grant_type=refresh_token, ten parametr jest tokenem odświeżania, który Google otrzymało z Twojego punktu końcowego wymiany tokenów. |
Konfigurowanie sposobu wysyłania danych logowania przez Google na Twój serwer
W zależności od implementacji serwer autoryzacji oczekuje otrzymania danych logowania klienta w treści żądania lub w nagłówku żądania.
Domyślnie Google wysyła dane logowania w treści żądania. Jeśli serwer autoryzacji wymaga, aby dane logowania klienta znajdowały się w nagłówku żądania, musisz odpowiednio skonfigurować integrację Cloud-to-cloud zgodnie z wymaganiami:
Na liście projektów kliknij Otwórz obok projektu, nad którym chcesz pracować.
W sekcji Cloud-to-cloud kliknij Opracuj.
Kliknij Otwórz obok integracji.
Przewiń w dół do sekcji Uprawnienia (opcjonalnie) i zaznacz pole Google ma przesyłać identyfikator klienta i tajny klucz w nagłówku HTTP basic auth.
Kliknij Zapisz , aby zapisać zmiany.
Wymiana kodów autoryzacji na tokeny dostępu i tokeny odświeżania
Gdy użytkownik się zaloguje, a punkt końcowy autoryzacji zwróci do Google ważny przez krótki czas kod autoryzacji, Google wyśle żądanie do punktu końcowego wymiany tokenów, aby wymienić kod autoryzacji na token dostępu i token odświeżania.
W przypadku tych żądań wartość grant_type to authorization_code, a
wartość code to wartość kodu autoryzacji, którą wcześniej przyznałeś(-aś)
Google. Oto przykład żądania wymiany kodu autoryzacji na token dostępu i token odświeżania:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
Aby wymieniać kody autoryzacji na token dostępu i token odświeżania, punkt końcowy wymiany tokenów odpowiada na żądania POST, wykonując te czynności:
- Sprawdź, czy
client_ididentyfikuje źródło żądania jako autoryzowane, aclient_secretodpowiada oczekiwanej wartości. - Sprawdź, czy kod autoryzacji jest prawidłowy i nie wygasł oraz czy identyfikator klienta podany w żądaniu odpowiada identyfikatorowi klienta powiązanemu z kodem autoryzacji.
- Sprawdź, czy adres URL określony przez parametr
redirect_urijest identyczny z wartością używaną w początkowym żądaniu autoryzacji. - Jeśli nie możesz zweryfikować wszystkich powyższych kryteriów, zwróć błąd HTTP
400 Bad Request z treścią
{"error": "invalid_grant"}. - W przeciwnym razie użyj identyfikatora użytkownika z kodu autoryzacji, aby wygenerować token odświeżania i token dostępu. Te tokeny mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego jest przeznaczony token, a także nie mogą być łatwe do odgadnięcia. W przypadku tokenów dostępu zapisz też czas ich ważności, który zwykle wynosi godzinę od momentu wydania tokena. Tokeny odświeżania nie wygasają.
- W treści odpowiedzi HTTPS zwróć ten obiekt JSON:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google przechowuje token dostępu i token odświeżania użytkownika oraz rejestruje wygaśnięcie tokena dostępu. Gdy token dostępu wygaśnie, Google użyje tokena odświeżania, aby uzyskać nowy token dostępu z punktu końcowego wymiany tokenów.
Wymiana tokenów odświeżania na tokeny dostępu
Gdy token dostępu wygaśnie, Google wyśle żądanie do punktu końcowego wymiany tokenów, aby wymienić token odświeżania na nowy token dostępu.
W przypadku tych żądań wartość grant_type to refresh_token, a wartość refresh_token to wartość tokena odświeżania, którą wcześniej przyznałeś(-aś) Google. Oto przykład żądania wymiany tokena odświeżania na token dostępu:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
Aby wymieniać token odświeżania na token dostępu, punkt końcowy wymiany tokenów odpowiada na żądania POST, wykonując te czynności:
- Sprawdź, czy
client_ididentyfikuje źródło żądania jako Google, aclient_secretodpowiada oczekiwanej wartości. - Sprawdź, czy token odświeżania jest prawidłowy oraz czy identyfikator klienta podany w żądaniu odpowiada identyfikatorowi klienta powiązanemu z tokenem odświeżania.
- Jeśli nie możesz zweryfikować wszystkich powyższych kryteriów, zwróć błąd HTTP 400
Bad Request z treścią
{"error": "invalid_grant"}. - W przeciwnym razie użyj identyfikatora użytkownika z tokena odświeżania, aby wygenerować token dostępu. Te tokeny mogą być dowolnym ciągiem znaków, ale muszą jednoznacznie reprezentować użytkownika i klienta, dla którego jest przeznaczony token, a także nie mogą być łatwe do odgadnięcia. W przypadku tokenów dostępu zapisz też czas ich ważności, który zwykle wynosi godzinę od momentu wydania tokena.
- W treści odpowiedzi HTTPS zwróć ten obiekt JSON:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Handle userinfo requests
The userinfo endpoint is an OAuth 2.0 protected resource that return claims about the linked user. Implementing and hosting the userinfo endpoint is optional, except for the following use cases:
- Linked Account Sign-In with Google One Tap.
- Frictionless subscription on AndroidTV.
After the access token has been successfully retrieved from your token endpoint, Google sends a request to your userinfo endpoint to retrieve basic profile information about the linked user.
| userinfo endpoint request headers | |
|---|---|
Authorization header |
The access token of type Bearer. |
For example, if your userinfo endpoint is available at
https://myservice.example.com/userinfo, a request might look like the following:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
For your userinfo endpoint to handle requests, do the following steps:
- Extract access token from the Authorization header and return information for the user associated with the access token.
- If the access token is invalid, return an HTTP 401 Unauthorized error with using the
WWW-AuthenticateResponse Header. Below is an example of a userinfo error response: If a 401 Unauthorized, or any other unsuccessful error response is returned during the linking process, the error will be non-recoverable, the retrieved token will be discarded and the user will have to initiate the linking process again.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
If the access token is valid, return and HTTP 200 response with the following JSON object in the body of the HTTPS response:
If your userinfo endpoint returns an HTTP 200 success response, the retrieved token and claims are registered against the user's Google account.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }userinfo endpoint response subA unique ID that identifies the user in your system. emailEmail address of the user. given_nameOptional: First name of the user. family_nameOptional: Last name of the user. nameOptional: Full name of the user. pictureOptional: Profile picture of the user.