Ogni integrazione di Cloud-to-cloud deve includere un meccanismo per autenticare gli utenti.
L'autenticazione ti consente di collegare gli Account Google dei tuoi utenti con gli account utente nel tuo sistema di autenticazione. In questo modo puoi identificare i tuoi utenti quando il tuo fulfillment riceve un intent per la smart home. Google Home per la smart home supporta solo OAuth con un flusso del codice di autorizzazione.
Questa pagina descrive come configurare il server OAuth 2.0 in modo che funzioni con l'integrazione di Cloud-to-cloud.
Collegamento dell'account Google con 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.
Flusso del codice di autorizzazione
Un'implementazione del flusso del codice di autorizzazione di un server OAuth 2.0 è costituita da due endpoint, che il tuo servizio rende disponibili tramite HTTPS. Il primo endpoint è l'endpoint di autorizzazione, che ha la responsabilità di trovare o ottenere il consenso degli utenti per l'accesso ai dati. L'endpoint di autorizzazione presenta un'interfaccia utente di accesso agli utenti che non hanno ancora eseguito l'accesso e registra il consenso all'accesso richiesto. Il secondo endpoint è l'endpoint di scambio dei token, che viene utilizzato per ottenere stringhe criptate, chiamate token, che autorizzano un utente ad accedere al tuo servizio.
Quando un'applicazione Google deve chiamare una delle API del tuo servizio, Google utilizza questi endpoint insieme per ottenere l'autorizzazione dagli utenti a chiamare queste API per loro conto.
Una sessione del flusso del codice di autorizzazione OAuth 2.0 avviata da Google ha il seguente flusso:
- Google apre l'endpoint di autorizzazione nel browser dell'utente. Se il flusso è iniziato su un dispositivo solo vocale per un'azione, Google trasferisce l'esecuzione a uno smartphone.
- Se non ha già eseguito l'accesso, l'utente accede e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API.
- Il tuo servizio crea un codice di autorizzazione e lo restituisce a Google. Per farlo, reindirizza il browser dell'utente a Google con il codice di autorizzazione allegato alla richiesta.
- Google invia il codice di autorizzazione all'endpoint di scambio dei token, che verifica l'autenticità del codice e restituisce un token di accesso e un token di aggiornamento. Il token di accesso è un token di breve durata che il tuo servizio accetta come credenziali per accedere alle API. Il token di aggiornamento è un token di lunga durata che Google può archiviare e utilizzare per acquisire nuovi token di accesso quando scadono.
- Una volta completato il flusso di collegamento dell'account, ogni richiesta successiva inviata da Google contiene un token di accesso.
Gestire le richieste di autorizzazione
Quando devi eseguire il collegamento dell'account utilizzando il flusso del codice di autorizzazione OAuth 2.0, Google invia l'utente all'endpoint di autorizzazione con una richiesta che include i seguenti parametri:
| Parametri dell'endpoint di autorizzazione | |
|---|---|
client_id |
L'ID client che hai assegnato a Google. |
redirect_uri |
L'URL a cui invii la risposta a questa richiesta. |
state |
Un valore di riferimento che viene restituito a Google senza modifiche nell' URI di reindirizzamento. |
scope |
Facoltativo: un insieme di stringhe di ambito delimitate da spazi che specificano i dati per cui Google sta richiedendo l'autorizzazione. |
response_type |
Il tipo di valore da restituire nella risposta. Per il flusso del codice di autorizzazione OAuth 2.0
il tipo di risposta è sempre code.
|
Ad esempio, se l'endpoint di autorizzazione è disponibile all'indirizzo https://myservice.example.com/auth, una richiesta potrebbe avere il seguente aspetto:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code
Per consentire all'endpoint di autorizzazione di gestire le richieste di accesso:
- Verifica che
client_idcorrisponda all'ID client che hai assegnato a Google e cheredirect_uricorrisponda all'URL di reindirizzamento fornito da Google per il tuo servizio. Questi controlli sono importanti per impedire la concessione dell'accesso ad app client non intenzionali o configurate in modo errato. Se supporti più flussi OAuth 2.0, verifica anche cheresponse_typesiacode. - Verifica se l'utente ha eseguito l'accesso al tuo servizio. Se l'utente non ha eseguito l'accesso, completa il flusso di accesso o registrazione del tuo servizio.
- Genera un codice di autorizzazione che Google possa utilizzare per accedere alla tua API. Il codice di autorizzazione può essere qualsiasi valore stringa, ma deve rappresentare in modo univoco l'utente, il client per cui è destinato il token e l'ora di scadenza del codice e non deve essere intuibile. In genere, i codici di autorizzazione scadono dopo circa 10 minuti.
- Verifica che l'URL specificato dal parametro
redirect_uriabbia il seguente formato:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- Reindirizza il browser dell'utente all'URL specificato dal
redirect_uriparametro. Quando esegui il reindirizzamento, includi il codice di autorizzazione appena generato e il valore dello stato originale e non modificato aggiungendo i parametricodeestate. Di seguito è riportato un esempio dell'URL risultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
Gestire le richieste di scambio dei token
L'endpoint di scambio dei token del tuo servizio è responsabile di due tipi di scambi di token:
- Scambio di codici di autorizzazione con token di accesso e token di aggiornamento
- Scambio di token di aggiornamento con token di accesso
Le richieste di scambio dei token includono i seguenti parametri:
| Parametri dell'endpoint di scambio dei token | |
|---|---|
client_id |
Una stringa che identifica l'origine della richiesta come Google. Questa stringa deve essere registrata nel tuo sistema come identificatore univoco di Google. |
client_secret |
Una stringa segreta registrata con Google per il tuo servizio. |
grant_type |
Il tipo di token scambiato. Può essere
authorization_code o refresh_token. |
code |
Quando grant_type=authorization_code, questo parametro è il
codice che Google ha ricevuto dal tuo endpoint di accesso o di scambio dei token. |
redirect_uri |
Quando grant_type=authorization_code, questo parametro è l'
URL utilizzato nella richiesta di autorizzazione iniziale. |
refresh_token |
Quando grant_type=refresh_token, questo parametro è il
token di aggiornamento che Google ha ricevuto dal tuo endpoint di scambio dei token. |
Configurare la modalità di invio delle credenziali da parte di Google al tuo server
A seconda dell'implementazione, il server di autorizzazione prevede di ricevere le credenziali client nel corpo della richiesta o nell'intestazione della richiesta.
Per impostazione predefinita, Google invia le credenziali nel corpo della richiesta. Se il tuo server di autorizzazione richiede che le credenziali client siano nell'intestazione della richiesta, devi configurare di conseguenza la tua integrazione Cloud-to-cloud:
Nell'elenco dei progetti, fai clic su Apri accanto al progetto con cui vuoi lavorare.
In Da cloud a cloud, seleziona Sviluppa.
Fai clic su Apri accanto all'integrazione.
Scorri verso il basso fino alla sezione Autorizzazioni (facoltativo) e seleziona la casella di controllo Fai in modo che Google trasmetta l'ID client e il segreto tramite l'intestazione di autenticazione di base HTTP.
Fai clic su Salva per salvare le modifiche.
Scambiare codici di autorizzazione con token di accesso e token di aggiornamento
Dopo che l'utente ha eseguito l'accesso e l'endpoint di autorizzazione restituisce a Google un codice di autorizzazione di breve durata, Google invia una richiesta all'endpoint di scambio dei token per scambiare il codice di autorizzazione con un token di accesso e un token di aggiornamento.
Per queste richieste, il valore di grant_type è authorization_code e il
valore di code è il valore del codice di autorizzazione che hai concesso in precedenza
a Google. Di seguito è riportato un esempio di richiesta di scambio di un codice di autorizzazione con un token di accesso e un token di aggiornamento:
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
Per scambiare i codici di autorizzazione con un token di accesso e un token di aggiornamento, l'endpoint di scambio dei token risponde alle richieste POST eseguendo i seguenti passaggi:
- Verifica che
client_ididentifichi l'origine della richiesta come origine autorizzata e checlient_secretcorrisponda al valore previsto. - Verifica che il codice di autorizzazione sia valido e non scaduto e che l'ID client specificato nella richiesta corrisponda all'ID client associato al codice di autorizzazione.
- Verifica che l'URL specificato dal parametro
redirect_urisia identico al valore utilizzato nella richiesta di autorizzazione iniziale. - Se non riesci a verificare tutti i criteri sopra indicati, restituisci un errore HTTP
400 Richiesta errata con
{"error": "invalid_grant"}come corpo. - In caso contrario, utilizza l'ID utente del codice di autorizzazione per generare un token di aggiornamento e un token di accesso. Questi token possono essere qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client per cui è destinato il token e non devono essere intuibili. Per i token di accesso, registra anche l'ora di scadenza del token, che in genere è un'ora dopo l'emissione del token. I token di aggiornamento non scadono.
- Restituisci il seguente oggetto JSON nel corpo della risposta HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google archivia il token di accesso e il token di aggiornamento per l'utente e registra la scadenza del token di accesso. Quando il token di accesso scade, Google utilizza il token di aggiornamento per ottenere un nuovo token di accesso dall'endpoint di scambio dei token.
Scambiare token di aggiornamento con token di accesso
Quando un token di accesso scade, Google invia una richiesta all'endpoint di scambio dei token per scambiare un token di aggiornamento con un nuovo token di accesso.
Per queste richieste, il valore di grant_type è refresh_token e il valore di refresh_token è il valore del token di aggiornamento che hai concesso in precedenza a Google. Di seguito è riportato un esempio di richiesta di scambio di un token di aggiornamento con un token di accesso:
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
Per scambiare un token di aggiornamento con un token di accesso, l'endpoint di scambio dei token risponde alle richieste POST eseguendo i seguenti passaggi:
- Verifica che
client_ididentifichi l'origine della richiesta come Google e checlient_secretcorrisponda al valore previsto. - Verifica che il token di aggiornamento sia valido e che l'ID client specificato nella richiesta corrisponda all'ID client associato al token di aggiornamento.
- Se non riesci a verificare tutti i criteri sopra indicati, restituisci un errore HTTP 400
Richiesta errata con
{"error": "invalid_grant"}come corpo. - In caso contrario, utilizza l'ID utente del token di aggiornamento per generare un token di accesso. Questi token possono essere qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client per cui è destinato il token e non devono essere intuibili. Per i token di accesso, registra anche l'ora di scadenza del token, in genere un'ora dopo l'emissione del token.
- Restituisci il seguente oggetto JSON nel corpo della risposta HTTPS:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Gestire le richieste di informazioni utente
L'endpoint userinfo è una risorsa protetta da OAuth 2.0 che restituisce attestazioni sull'utente collegato. L'implementazione e l'hosting dell'endpoint userinfo sono facoltative, ad eccezione dei seguenti casi d'uso:
- Accesso a un account collegato con Google One Tap.
- Abbonamento senza problemi su AndroidTV.
Dopo che il token di accesso è stato recuperato correttamente dall'endpoint del token, Google invia una richiesta all'endpoint userinfo per recuperare le informazioni di base del profilo dell'utente collegato.
| intestazioni delle richieste endpoint userinfo | |
|---|---|
Authorization header |
Il token di accesso di tipo Bearer. |
Ad esempio, se l'endpoint userinfo è disponibile su
https://myservice.example.com/userinfo, una richiesta potrebbe avere il seguente aspetto:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
Affinché l'endpoint userinfo possa gestire le richieste, segui questi passaggi:
- Estrai il token di accesso dall'intestazione Autorizzazione e restituisci le informazioni per l'utente associato al token di accesso.
- Se il token di accesso non è valido, restituisce un errore HTTP 401 Autorizzazione non autorizzata utilizzando l'intestazione della risposta
WWW-Authenticate. Di seguito è riportato un esempio di risposta di errore userinfo: Se durante la procedura di collegamento viene restituito un errore 401 Autorizzazione o qualsiasi altra risposta di errore non riuscita durante la procedura di collegamento, l'errore non sarà recuperabile, il token recuperato verrà eliminato e l'utente dovrà avviare nuovamente la procedura di collegamento.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Se il token di accesso è valido, restituisce e invia una risposta HTTP 200 con il seguente oggetto JSON nel corpo dell'HTTPS risposta:
Se l'endpoint userinfo restituisce una risposta HTTP 200 riuscita, il token e le attestazioni recuperati vengono registrati in base all'Account Google dell'utente.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }risposta endpoint userinfo subUn ID univoco che identifica l'utente nel sistema. emailIndirizzo email dell'utente. given_nameFacoltativo:nome dell'utente. family_nameFacoltativo:il cognome dell'utente. nameFacoltativo:nome completo dell'utente. picture(Facoltativo) Immagine del profilo dell'utente.