Implementare un server OAuth 2.0

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 agli account utente del tuo sistema di autenticazione. In questo modo puoi identificare i tuoi utenti quando il tuo Fulfillment riceve un'intenzione per la smart home. La smart home di Google supporta OAuth solo con un flusso di 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

Nel flusso del codice di autorizzazione, sono necessari due endpoint:

  • L'endpoint di autorizzazione, che presenta la UI di accesso agli utenti che non hanno ancora eseguito l'accesso. L'endpoint di autorizzazione crea anche un codice di autorizzazione di breve durata per registrare il consenso degli utenti all'accesso richiesto.

  • L'endpoint di scambio di token, che è responsabile di due tipi di scambi:

    1. Scambia un codice di autorizzazione con un token di aggiornamento di lunga durata e un token di accesso di breve durata. Questo scambio avviene quando l'utente accede al flusso di collegamento dell'account.
    2. Scambia un token di aggiornamento di lunga durata con un token di accesso di breve durata. Questo scambio si verifica quando Google ha bisogno di un nuovo token di accesso perché quello è scaduto.

Istruzioni sul design

Questa sezione descrive i requisiti di progettazione e i suggerimenti per la schermata utente che ospiti per i flussi di collegamento OAuth. Dopo essere stata chiamata dall'app di Google, la piattaforma mostra all'utente una pagina di accesso alla pagina Google e la schermata per il collegamento dell'account. L'utente viene reindirizzato all'app di Google dopo aver dato il suo consenso a collegare gli account.

Questa figura mostra i passaggi che devono essere eseguiti da un utente per collegare il proprio Account Google al tuo sistema di autenticazione. Il primo screenshot mostra il collegamento avviato dall'utente dalla tua piattaforma. La seconda immagine mostra l'accesso dell'utente a Google, mentre la terza mostra il consenso e la conferma dell'utente per il collegamento del suo Account Google alla tua app. Lo screenshot finale mostra un account utente collegato correttamente nell'app Google.
Figura 1. Accesso dell'utente a Google e schermate per il consenso con il collegamento dell'account.

Requisiti

  1. Devi comunicare che l'account dell'utente verrà collegato a Google, non a un prodotto Google specifico come Google Home o l'Assistente Google.
  2. Devi avere una dichiarazione di autorizzazione di Google, ad esempio "Se accedi, autorizzi Google a controllare i tuoi dispositivi". Consulta la sezione relativa all'autorizzazione per il controllo dei dispositivi Google delle norme per gli sviluppatori di Google Home.
  3. Devi fornire agli utenti un modo per tornare indietro o annullare il collegamento, se scelgono di non effettuare il collegamento.
  4. Devi aprire la pagina di collegamento OAuth web e assicurarti che gli utenti dispongano di un metodo chiaro per accedere al proprio Account Google, ad esempio i campi per nome utente e password. Non utilizzare il metodo Accedi con Google (GSI) che consente agli utenti di effettuare il collegamento senza essere indirizzati alla pagina Collegamento OAuth per il Web. Si tratta di una violazione delle norme di Google.

Suggerimenti

Ti consigliamo di procedere nel seguente modo:

  1. Visualizza le Norme sulla privacy di Google. Includi un link alle Norme sulla privacy di Google nella schermata per il consenso.

  2. Dati da condividere. Utilizza un linguaggio chiaro e conciso per comunicare all'utente quali dati richiede Google e perché.

  3. Invito all'azione chiaro. Indica un invito all'azione chiaro nella schermata per il consenso, ad esempio "Accetta e collega". Questo perché gli utenti devono capire quali dati sono tenuti a condividere con Google per collegare i propri account.

  4. Possibilità di scollegamento. Offri agli utenti un meccanismo di scollegamento, ad esempio un URL che rimanda alle impostazioni dell'account sulla tua piattaforma. In alternativa, puoi includere un link all'Account Google in cui gli utenti possono gestire il proprio account collegato.

  5. Possibilità di cambiare account utente. Suggerisci agli utenti un metodo per cambiare account. Ciò è particolarmente utile se gli utenti tendono ad avere più account.

    • Se un utente deve chiudere la schermata di consenso per cambiare account, invia un errore recuperabile a Google in modo che l'utente possa accedere all'account desiderato con il collegamento OAuth.
  6. Includi il tuo logo. Mostra il logo della tua azienda nella schermata per il consenso. Segui le tue linee guida per lo stile per posizionare il logo. Se vuoi mostrare anche il logo di Google, consulta la sezione Loghi e marchi.

Flusso del codice di autorizzazione

Un'implementazione del server OAuth 2.0 del flusso del codice di autorizzazione è costituita da due endpoint che il servizio rende disponibili tramite HTTPS. Il primo endpoint è l'endpoint di autorizzazione, che è responsabile della ricerca o dell'ottenimento del 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 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 insieme questi endpoint per ottenere l'autorizzazione degli 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:

  1. Google apre il tuo endpoint di autorizzazione nel browser dell'utente. Se il flusso è stato avviato su un dispositivo solo vocale per un'azione, Google trasferisce l'esecuzione a uno smartphone.
  2. L'utente accede, se non l'ha ancora fatto, e concede a Google l'autorizzazione ad accedere ai suoi dati con la tua API, se non l'ha già fatto.
  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 al tuo endpoint di scambio token, che verifica l'autenticità del codice e restituisce un token di accesso e un token di aggiornamento. Il token di accesso è un token a breve durata accettato dal servizio come credenziali per accedere alle API. Il token di aggiornamento è un token di lunga durata che Google può memorizzare 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 al tuo 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 inviare la risposta a questa richiesta.
state Un valore di riferimento che viene ritrasmesso a Google invariato nell'URI di reindirizzamento.
scope Facoltativo:un insieme di stringhe di ambito separate da spazi che specificano i dati per i quali 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 dall'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

Affinché l'endpoint di autorizzazione gestisca le richieste di accesso, svolgi i seguenti 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 accesso a app client non intenzionali 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 del servizio.
  3. Genera un codice di autorizzazione da utilizzare da parte di Google per accedere alla tua API. Il codice di autorizzazione può essere qualsiasi valore di stringa, ma deve rappresentare in modo univoco l'utente, il client a cui è destinato il token e la data di scadenza del codice e non deve essere deducibile. 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 dello stato originale non modificato quando reindirizzi aggiungendo i parametri code e state. 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 di token

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

  • Scambiare i codici di autorizzazione con token di accesso e token di aggiornamento
  • Scambiare i token di aggiornamento con i token di accesso

Le richieste di scambio di token includono i seguenti parametri:

Parametri dell'endpoint di scambio di 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 Se grant_type=authorization_code, questo parametro è il codice ricevuto da Google dall'endpoint di accesso o di scambio di token.
redirect_uri Se grant_type=authorization_code, questo parametro è l'URL utilizzato nella richiesta di autorizzazione iniziale.
refresh_token Se grant_type=refresh_token, questo parametro è il token di aggiornamento ricevuto da Google dal tuo endpoint di scambio token.

Configurare il modo in cui Google invia le credenziali al server

A seconda dell'implementazione, il server di autorizzazione si aspetta di ricevere le credenziali del 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 del client siano nell'header della richiesta, devi configurare l'integrazione di Cloud-to-cloud adeguatamente:

Vai a Developers Console

  1. Nell'elenco dei progetti, fai clic su Apri accanto al progetto con cui vuoi lavorare.

  2. In Cloud-to-Cloud, seleziona Sviluppa.

  3. Fai clic su Apri accanto all'integrazione.

  4. Scorri verso il basso fino alla sezione Autorizzazioni (facoltative) e seleziona la casella di controllo Chiedi a Google di trasmettere l'ID cliente e il segreto tramite l'intestazione di autenticazione di base HTTP.

  5. Fai clic su Salva per salvare le modifiche.

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

Dopo che l'utente ha eseguito l'accesso e il tuo endpoint di autorizzazione ha restituito a Google un codice di autorizzazione a breve durata, Google invia una richiesta al tuo endpoint di scambio di 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 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 non sia scaduto e che l'ID cliente specificato nella richiesta corrisponda a quello 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 sopra indicati, restituisci un errore HTTP 400 Bad Request con {"error": "invalid_grant"} come corpo.
  5. 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 di stringa, ma devono rappresentare in modo univoco l'utente e il client a cui si riferiscono e non devono essere deducibili. Per i token di accesso, registra anche la data e l'ora di scadenza del token, che in genere è un'ora dopo l'emissione. I token di aggiornamento non hanno scadenza.
  6. Restituire 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 memorizza 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 token.

Scambiare i token di aggiornamento con i token di accesso

Quando un token di accesso scade, Google invia una richiesta all'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 concesso in precedenza a Google. Di seguito è riportato un esempio di richiesta di scambio di un token di aggiornamento per 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 a quello associato al token di aggiornamento.
  3. Se non riesci a verificare tutti i criteri sopra indicati, restituisci un errore HTTP 400 Richiesta non valida con {"error": "invalid_grant"} come corpo.
  4. In caso contrario, utilizza l'ID utente del token di aggiornamento per generare un token di accesso. Questi token possono essere qualsiasi valore di stringa, ma devono rappresentare in modo univoco l'utente e il client a cui si riferiscono e non devono essere deducibili. Per i token di accesso, registra anche la data e l'ora di scadenza del token, solitamente un'ora dopo l'emissione.
  5. Restituire 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:

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:

  1. Estrai il token di accesso dall'intestazione Autorizzazione e restituisci le informazioni per l'utente associato al token di accesso.
  2. 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:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    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.
  3. Se il token di accesso è valido, restituisce e invia una risposta HTTP 200 con il seguente oggetto JSON nel corpo dell'HTTPS risposta:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    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.

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