Collegamento semplificato con OAuth e Accedi con Google

Panoramica

Collegamento semplificato di Accedi con Google basato su OAuth aggiunge Accedi con Google in aggiunta al collegamento OAuth. In questo modo, gli utenti Google possono collegare facilmente i propri account e, se vogliono, possono creare un account sul tuo servizio utilizzando il proprio Account Google.

Per eseguire il collegamento degli account con OAuth e Accedi con Google, segui questi passaggi generali:

  1. Per prima cosa, chiedi all'utente di dare il consenso per accedere al suo profilo Google.
  2. Utilizza le informazioni nel profilo per verificare se l'account utente esiste.
  3. Per gli utenti esistenti, collega gli account.
  4. Se non riesci a trovare una corrispondenza per l'utente Google nel tuo sistema di autenticazione, convalida il token ID ricevuto da Google. Se il tuo servizio supporta la creazione di account, puoi creare un utente in base alle informazioni del profilo contenute nel token ID.
Questa figura mostra i passaggi che un utente deve seguire per collegare il proprio Account Google utilizzando il flusso di collegamento semplificato. Il primo screenshot mostra come un utente può selezionare la tua app per il collegamento. La seconda schermata consente all'utente di confermare se ha o meno un account esistente sul tuo servizio. La terza schermata consente all'utente di selezionare l'Account Google da collegare. Il quarto screenshot mostra la conferma del collegamento dell'Account Google all'app. Il quinto screenshot mostra un account utente collegato correttamente nell'app Google.
Collegamento degli account sullo smartphone di un utente con il collegamento semplificato

Figura 1. Collegamento dell'account sullo smartphone di un utente con il collegamento semplificato

Collegamento semplificato: flusso OAuth + Accedi con Google

Il seguente diagramma di sequenza descrive in dettaglio le interazioni tra l'utente, Google e l'endpoint di scambio di token per il collegamento semplificato.

Utente App Google / Server Il tuo token Endpoint di scambio La tua API 1. L'utente avvia il collegamento 2. Richiedi Accedi con Google 3. Accedi con Google 4. check intent (JWT Assertion) 5. account_found: true/false If account found: 6. get intent If no account: 6. create intent 7. access_token, refresh_token 8. Memorizza i token utente 9. Accedere alle risorse utente
Figura 2. La sequenza di eventi nel flusso di collegamento semplificato.

Ruoli e responsabilità

La seguente tabella definisce i ruoli e le responsabilità degli attori nel flusso di collegamento semplificato.

Attore / componente Ruolo GAL Responsabilità
App / server Google Client OAuth Ottiene il consenso dell'utente per Accedi con Google, trasmette le asserzioni di identità (JWT) al tuo server e archivia in modo sicuro i token risultanti.
Endpoint di scambio token Provider di identità / server di autorizzazione Convalida le asserzioni di identità, verifica la presenza di account esistenti, gestisce gli intent di collegamento degli account richiesti (check, get) e l'intent facoltativo create ed emette token in base agli intent richiesti.
La tua API di servizio Resource Server Fornisce l'accesso ai dati utente quando viene presentato un token di accesso valido.

Requisiti per il collegamento semplificato

  • Implementa il flusso di collegamento OAuth di base. Il tuo servizio deve supportare endpoint di autorizzazione e scambio di token conformi a OAuth 2.0.
  • L'endpoint di scambio di token deve supportare le asserzioni JSON Web Token (JWT) e implementare gli intent check e get richiesti, nonché, facoltativamente, l'intent create.

Logica decisionale per il collegamento semplificato

La seguente logica determina come vengono chiamati gli intent durante il flusso di collegamento semplificato:

  1. L'utente ha un account nel tuo sistema di autenticazione? (L'utente decide selezionando SÌ o NO)
    1. SÌ : l'utente utilizza l'email associata al suo Account Google per accedere alla tua piattaforma? (L'utente decide selezionando SÌ o NO)
      1. SÌ : l'utente ha un account corrispondente nel tuo sistema di autenticazione? (check intent viene chiamato per la conferma)
        1. SÌ : viene chiamato l'intent get e l'account viene collegato se get intent viene restituito correttamente.
        2. NO : Create New Account? (L'utente decide selezionando SÌ o NO; applicabile solo se il tuo servizio supporta la creazione di account)
          1. SÌ : viene chiamato l'intent create e l'account viene collegato se l'intent di creazione viene restituito correttamente.
          2. NO : viene attivato il flusso di collegamento OAuth, l'utente viene indirizzato al browser e gli viene data la possibilità di collegarsi con un'altra email.
      2. NO : viene attivato il flusso di collegamento OAuth, l'utente viene indirizzato al browser e gli viene data la possibilità di collegarsi con un'altra email.
    2. NO : l'utente ha un account corrispondente nel tuo sistema di autenticazione? (check intent viene chiamato per la conferma)
      1. SÌ : viene chiamato l'intent get e l'account viene collegato se get intent viene restituito correttamente.
      2. NO : se il tuo servizio supporta la creazione di account, viene chiamato l'intent create e l'account viene collegato se l'intent di creazione viene restituito correttamente. Se la creazione dell'account non è supportata, l'endpoint deve restituire l'errore HTTP 401 linking_error per attivare il flusso di collegamento OAuth di riserva.

Implementation Recipe

L'endpoint di scambio di token deve implementare gli intent check e get richiesti e, facoltativamente, l'intent create per supportare il collegamento semplificato.

Segui questi passaggi per gestire i diversi intent:

检查现有用户账号(检查 intent)

Google 会调用您的令牌交换端点,以验证 Google 用户是否存在于您的系统中。如需了解参数详情,请参阅简化的关联 intent

实现方案

如需处理所需的 check intent,请执行以下操作:

  1. 验证请求

    • 验证 client_idclient_secretgrant_type(必须为 urn:ietf:params:oauth:grant-type:jwt-bearer)。
    • 使用 JWT 验证 中的条件验证 assertion (JWT)。
  2. 查找用户

    • 检查 JWT 中的 Google 账号 ID (sub) 或电子邮件地址是否与数据库中的用户匹配。
  3. 回应

    • 如果找到:返回 HTTP 200 OK,并附带 {"account_found": "true"}
    • 如果未找到:返回 HTTP 404 Not Found,并附带 {"account_found": "false"}

处理自动关联(获取 intent)

如果账号存在,Google 会使用 intent=get 调用您的端点以检索令牌。如需了解参数详情,请参阅简化的关联 intent

实现方案

如需处理所需的 get intent,请执行以下操作:

  1. 验证请求

    • 验证 client_idclient_secretgrant_type
    • 验证 assertion (JWT)。
  2. 查找用户

    • 使用 subemail 声明验证用户是否存在。
  3. 回应

    • 如果成功:在 JSON 响应 (HTTP 200 OK) 中生成并返回 access_tokenrefresh_tokenexpires_in
    • 如果关联失败:返回 HTTP 401 Unauthorized,其中包含 {"error": "linking_error"} 和可选的 login_hint,以便回退 到标准 OAuth 关联。

使用“使用 Google 账号登录”功能处理账号创建事宜(创建 intent)

如果您的服务支持账号创建,并且不存在任何账号,Google 会使用 intent=create 调用您的端点,以创建新用户。如需了解参数详情, 请参阅 简化的关联流程 intent

实现方案

如需处理可选的 create intent,请执行以下操作:

  1. 验证请求

    • 验证 client_idclient_secretgrant_type
    • 验证 assertion (JWT)。
  2. 验证用户不存在

    • 检查您的数据库中是否已存在 subemail
    • 如果用户存在,请返回 HTTP 401 Unauthorized,并使用 {"error": "linking_error", "login_hint": "USER_EMAIL"}强制 回退到 OAuth 关联流程。
  3. 创建账号

    • 使用 JWT 中的 subemailnamepicture 声明创建新的用户记录。
  4. 回应

    • 在 JSON 响应中生成并返回令牌 (HTTP 200 OK)。

Ottenere l'ID client API di Google

Ti verrà chiesto di fornire l'ID client API di Google durante la procedura di registrazione del collegamento degli account. Per ottenere l'ID client API utilizzando il progetto che hai creato durante il completamento dei passaggi di collegamento OAuth. Per farlo, completa i seguenti passaggi:

  1. Vai alla pagina Clienti.
  2. Crea o seleziona un progetto API di Google.

    Se il tuo progetto non ha un ID client per il tipo di applicazione web, fai clic su Crea client per crearne uno. Assicurati di includere il dominio del tuo sito nella casella Origini JavaScript autorizzate. Quando esegui test locali o sviluppo, devi aggiungere sia http://localhost sia http://localhost:<port_number> al campo Origini JavaScript autorizzate.

Convalidare l'implementazione

Puoi convalidare l'implementazione utilizzando lo strumento OAuth 2.0 Playground.

Nello strumento, segui questi passaggi:

  1. Fai clic su Configurazione per aprire la finestra di configurazione di OAuth 2.0.
  2. Nel campo Flusso OAuth, seleziona Lato client.
  3. Nel campo Endpoint OAuth, seleziona Personalizzato.
  4. Specifica l'endpoint OAuth 2.0 e l'ID client che hai assegnato a Google nei campi corrispondenti.
  5. Nella sezione Passaggio 1, non selezionare alcun ambito Google. Lascia invece questo campo vuoto o digita un ambito valido per il tuo server (o una stringa arbitraria se non utilizzi gli ambiti OAuth). Quando hai finito, fai clic su Autorizza API.
  6. Nelle sezioni Passaggio 2 e Passaggio 3, segui il flusso OAuth 2.0 e verifica che ogni passaggio funzioni come previsto.

Puoi convalidare l'implementazione utilizzando lo strumento Demo di collegamento dell'Account Google.

Nello strumento, segui questi passaggi:

  1. Fai clic sul pulsante Accedi con Google.
  2. Scegli l'account che vuoi collegare.
  3. Inserisci l'ID servizio.
  4. (Facoltativo) Inserisci uno o più ambiti per i quali richiederai l'accesso.
  5. Fai clic su Avvia demo.
  6. Quando richiesto, conferma che puoi dare il consenso e rifiutare la richiesta di collegamento.
  7. Verifica di essere reindirizzato alla tua piattaforma.