Ti diamo il benvenuto nel Centro sviluppatori Google Home, la nuova destinazione per imparare a sviluppare azioni per la smart home. Nota:continuerai a creare azioni nella Console Actions.

Implementare un server OAuth 2.0

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Ogni azione per la smart home deve includere un meccanismo per autenticare gli utenti.

L'autenticazione consente di collegare gli Account Google degli utenti agli account utente nel tuo sistema di autenticazione. Ciò consente di identificare gli utenti quando il fulfillment riceve un intent per la smart home. La smart home Google supporta solo OAuth con un flusso di codice di autorizzazione.

In questa pagina viene descritto come configurare il server OAuth 2.0 in modo che funzioni con la tua azione Smart Home.

Flusso codice di autorizzazione

Un'implementazione del server OAuth 2.0 del flusso del codice di autorizzazione consiste in due endpoint, che il tuo servizio rende disponibili tramite HTTPS. Il primo endpoint è l'endpoint di autorizzazione, che è responsabile di ottenere o ottenere il consenso degli utenti per l'accesso ai dati. L'endpoint di autorizzazione presenta una UI 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, utilizzato per ottenere stringhe criptate, dette 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 degli utenti a chiamare tali API per loro conto.

Una sessione di flusso del codice di autorizzazione OAuth 2.0 avviata da Google ha il seguente flusso:

  1. Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Se il flusso è iniziato su un dispositivo con sola voce per un'azione, Google trasferisce l'esecuzione a un telefono.
  2. L'utente accede, se non ha già eseguito l'accesso, e concede a Google l'autorizzazione per accedere ai suoi dati con la tua API, se non ha già concesso l'autorizzazione.
  3. Il 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.
  4. Google invia il codice di autorizzazione all'endpoint di scambio di 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 accettato dal servizio 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 alla scadenza.
  5. Dopo che l'utente ha 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 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 contabilità ritrasmesso a Google invariato nell'URI di reindirizzamento.
scope Facoltativo: un insieme di stringhe di ambito delimitate da spazi che specificano i dati per cui Google richiede 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.
user_locale L'impostazione della lingua dell'Account Google in formato RFC5646, utilizzata per localizzare i contenuti nella lingua preferita dell'utente.

Ad esempio, se il tuo 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&user_locale=LOCALE

Per fare in modo che l'endpoint di autorizzazione gestisca le richieste di accesso, segui questi passaggi:

  1. Verifica che client_id corrisponda all'ID client che hai assegnato a Google e che redirect_uri corrisponda all'URL di reindirizzamento fornito da Google per il tuo servizio. Questi controlli sono importanti per evitare di concedere l'accesso ad app client indesiderate o configurate in modo errato. Se supporti più flussi OAuth 2.0, verifica anche che response_type sia code.
  2. Controlla se l'utente ha eseguito l'accesso al tuo servizio. Se l'utente non ha eseguito l'accesso, completa la procedura di accesso o registrazione.
  3. Generare un codice di autorizzazione che Google possa utilizzare per accedere all'API. Il codice di autorizzazione può essere qualsiasi valore stringa, ma deve rappresentare in modo univoco l'utente, il client a cui è destinato il token e la scadenza del codice e non deve essere intuibile. In genere emetti codici di autorizzazione che scadono dopo circa 10 minuti.
  4. Verifica che l'URL specificato dal parametro redirect_uri abbia il seguente formato:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Reindirizza il browser dell'utente all'URL specificato dal parametro redirect_uri. Includi il codice di autorizzazione appena generato e il valore originale dello stato non modificato quando esegui il reindirizzamento aggiungendo i parametri code e state. Di seguito è riportato un esempio di URL risultante:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Gestire le richieste di scambio di token

L'endpoint di scambio di token del servizio è responsabile di due tipi di scambi di token:

  • Scambiare codici di autorizzazione per i token di accesso e i token di aggiornamento
  • Token di aggiornamento Exchange per i token di accesso

Le richieste di scambio di token includono i seguenti parametri:

Parametri endpoint di Exchange per il token
client_id Una stringa che identifica l'origine della richiesta come Google. Questa stringa deve essere registrata all'interno del 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. È authorization_code o refresh_token.
code Quando grant_type=authorization_code, questo parametro è il codice che Google ha ricevuto dall'endpoint di accesso o dallo scambio di 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 di token.

Scambiare codici di autorizzazione per i token di accesso e i token di aggiornamento

Dopo che l'utente ha eseguito l'accesso e dopo che l'endpoint di autorizzazione restituisce un codice di autorizzazione di breve durata a Google, 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 precedentemente concesso 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 di token risponde alle richieste POST eseguendo i seguenti passaggi:

  1. Verifica che client_id identifichi l'origine della richiesta come un'origine autorizzata e che client_secret corrisponda al valore previsto.
  2. Verifica che il codice di autorizzazione sia valido e che non sia scaduto e che l'ID client specificato nella richiesta corrisponda all'ID client associato al codice di autorizzazione.
  3. Verifica che l'URL specificato dal parametro redirect_uri sia identico al valore utilizzato nella richiesta di autorizzazione iniziale.
  4. Se non riesci a verificare tutti i criteri riportati sopra, restituisci un errore HTTP 400 Bad Request con {"error": "invalid_grant"} come corpo.
  5. In caso contrario, utilizza lo User-ID del codice di autorizzazione per generare un token di aggiornamento e un token di accesso. Questi token possono essere di qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client a cui è destinato il token e non devono essere indovinabili. Per i token di accesso, registra anche la data di scadenza del token, che di solito è un'ora dopo l'emissione. I token di aggiornamento non hanno scadenza.
  6. Restituisce 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. Alla scadenza del token di accesso, Google lo utilizza per ricevere un nuovo token di accesso dal tuo endpoint di scambio di token.

Token di aggiornamento Exchange per i token di accesso

Alla scadenza di un token di accesso, Google invia una richiesta al tuo endpoint di scambio di 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 precedentemente concesso 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 di token risponde alle richieste POST eseguendo i seguenti passaggi:

  1. Verifica che client_id identifichi l'origine della richiesta come Google e che client_secret corrisponda al valore previsto.
  2. 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.
  3. Se non riesci a verificare tutti i criteri riportati sopra, restituisci un errore HTTP 400 Request errato con {"error": "invalid_grant"} come corpo.
  4. In caso contrario, utilizza lo User-ID del token di aggiornamento per generare un token di accesso. Questi token possono essere di qualsiasi valore stringa, ma devono rappresentare in modo univoco l'utente e il client a cui è destinato il token e non devono essere incerti. Per i token di accesso, registra anche la sua data di scadenza, in genere un'ora dopo l'emissione.
  5. Restituisce 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 rivendicazioni sull'utente collegato. L'implementazione e l'hosting dell'endpoint userinfo sono facoltativi, ad eccezione dei seguenti casi d'uso:

Dopo che il token di accesso è stato recuperato correttamente dal tuo endpoint token, Google invia una richiesta al tuo endpoint userinfo per recuperare le informazioni di base del profilo dell'utente collegato.

Intestazioni delle richieste endpoint utenteinfo
Authorization header Il token di accesso di tipo Bearer.

Ad esempio, se il tuo endpoint userinfo è disponibile all'indirizzo 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

Per fare in modo che l'endpoint userinfo gestisca le richieste, segui questi passaggi:

  1. Estrai il token di accesso dall'intestazione Authorization e restituisce le informazioni per l'utente associato al token di accesso.
  2. Se il token di accesso non è valido, restituisci un errore HTTP 401 Non autorizzato utilizzando l'intestazione della risposta WWW-Authenticate. Di seguito è riportato un esempio di risposta di errore userinfo:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    Se durante il processo di collegamento viene visualizzato un messaggio di errore 401 Non autorizzato o di altro tipo non riuscito, l'errore sarà irreversibile, il token recuperato verrà eliminato e l'utente dovrà riavviarlo.
  3. Se il token di accesso è valido, restituisci una risposta HTTP 200 con il seguente oggetto JSON nel corpo della risposta HTTPS:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    Se l'endpoint infoutente restituisce una risposta HTTP 200 riuscita, il token e le rivendicazioni recuperate vengono registrati nell'Account Google dell'utente.

    Risposta endpoint info utente
    sub Un ID univoco che identifica l'utente nel tuo sistema.
    email Indirizzo email dell'utente.
    given_name Facoltativo: nome dell'utente.
    family_name Facoltativo: il cognome dell'utente.
    name Facoltativo: il nome completo dell'utente.
    picture (Facoltativo) Immagine del profilo dell'utente.