Login na conta vinculada

Com a vinculação de Contas do Google, os proprietários podem se conectar de forma rápida, fácil e segura aos seus serviços e compartilhar dados com o Google.

A opção "Login da conta vinculada" ativa o Login com um toque do Google para usuários que já têm a Conta do Google vinculada ao seu serviço. Isso melhora a experiência dos usuários, já que é possível fazer login com apenas um clique, sem precisar digitar novamente o nome de usuário e a senha. Isso também reduz as chances de usuários criarem contas duplicadas no seu serviço.

Requisitos

Para implementar o login com contas vinculadas, você precisa atender aos seguintes requisitos:

  • Você tem uma implementação de Vinculação do OAuth da Conta do Google compatível com o fluxo do código de autorização do OAuth 2.0. Sua implementação do OAuth precisa incluir os seguintes endpoints:
    • endpoint de autorização para processar solicitações de autorização.
    • endpoint de token para processar a solicitação de token de acesso e atualização.
    • endpoint userinfo para recuperar informações básicas da conta sobre o usuário vinculado que são exibidas durante o processo de login na conta vinculada.
  • Você tem um app Android.

Como funciona

Pré-requisito : o usuário já vinculou a Conta do Google à conta no serviço.

  1. Você ativa a exibição de contas vinculadas durante o fluxo de login com um toque.
  2. O usuário verá uma solicitação de login com um toque, além da opção de fazer login no serviço com a conta vinculada.
  3. Se o usuário escolher continuar com a conta vinculada, o Google enviará uma solicitação ao endpoint do token para salvar um código de autorização. A solicitação contém o token de acesso do usuário emitido pelo seu serviço e um código de autorização do Google.
  4. Você troca o código de autorização do Google por um token de código do Google que contém informações sobre a Conta do Google do usuário.
  5. O app também recebe um token de ID quando o fluxo termina e você faz a correspondência com o identificador de usuário no token de ID recebido pelo servidor para fazer login do usuário no app.
Login da conta vinculada.
Figura 1. Fluxo de login da conta vinculada. Se o usuário tiver várias contas conectadas no dispositivo, ele verá um seletor de conta e só será levado para a visualização de login vinculado se selecionar uma conta vinculada.

Implementar o Login de conta vinculada no seu app Android

Para oferecer suporte a esse recurso no seu app Android, siga as instruções no guia de implementação para Android.

Processar solicitações de código de autorização do Google

O Google faz uma solicitação POST ao seu endpoint de token para salvar um código de autorização que você troca pelo token de ID do usuário. A solicitação contém o token de acesso do usuário e um código de autorização OAuth2 emitido pelo Google.

Antes de salvar o código de autorização, verifique se o token de acesso foi concedido a você pelo Google, identificado pelo client_id.

Solicitação HTTP

Exemplo de solicitação

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

O endpoint de troca de token precisa ser capaz de processar os seguintes parâmetros de solicitação:

Parâmetros de endpoint de token
code Obrigatório Código de autorização do Google OAuth2
client_id Obrigatório ID do cliente emitido para o Google
client_secret Obrigatório Chave secreta do cliente emitida para o Google
access_token Obrigatório Token de acesso emitido para o Google. Ele será usado para contextualizar o usuário
grant_type Obrigatório O valor PRECISA ser definido como urn:ietf:params:oauth:grant-type:reciprocal

O endpoint de troca de token deve responder à solicitação POST da seguinte forma:

  • Verifique se o access_token foi concedido ao Google identificado pelo client_id.
  • Responda com uma resposta HTTP 200 (OK) se a solicitação for válida e o código de autenticação for trocado por um token de código do Google, ou um código de erro HTTP se a solicitação for inválida.

Resposta HTTP

Sucesso

Retornar código de status HTTP 200 OK

Exemplo de resposta de sucesso
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Erros

No caso de uma solicitação HTTP inválida, responda com um dos seguintes códigos de erro HTTP:

Código de status HTTP Corpo Descrição
400 {"error": "invalid_request"} Falta um parâmetro na solicitação para que o servidor não possa prosseguir com ela. Isso também poderá ser retornado se a solicitação incluir um parâmetro incompatível ou repetir um parâmetro
401 {"error": "invalid_request"} Falha na autenticação do cliente, como se a solicitação tiver um ID do cliente ou uma chave secreta inválida.
401 {"error": "invalid_token"}

Inclua o desafio de autenticação "WWW-Authentication: Bearer" no cabeçalho de resposta

O token de acesso do parceiro é inválido.
403 {"error": "insufficient_permission"}

Inclua o desafio de autenticação "WWW-Authentication: Bearer" no cabeçalho de resposta

O token de acesso do parceiro não contém os escopos necessários para executar o OAuth recíproco
500 {"error": "internal_error"} Erro no servidor

A resposta de erro deve conter os seguintes campos :

Campos de resposta de erro
error Obrigatório String de erro
error_description Descrição legível do erro
error_uri URI que fornece mais detalhes sobre o erro
Exemplo de resposta de erro 400
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Trocar código de autorização do token de ID

Você precisará trocar o código de autorização que recebeu por um token de código do Google que contém informações sobre a Conta do Google do usuário.

Para trocar um código de autorização por um token de código do Google, chame o endpoint https://oauth2.googleapis.com/token e defina os seguintes parâmetros:

Campos de solicitação
client_id Obrigatório O ID do cliente recebido da página "Credenciais" do Console de APIs. Geralmente essa é a credencial com o nome New Actions on Google App.
client_secret Obrigatório O segredo do cliente obtido na página Credenciais do Console de APIs
code Obrigatório O código de autorização enviado na solicitação inicial
grant_type Obrigatório Conforme definido na especificação do OAuth 2.0, o valor deste campo precisa ser definido como authorization_code.
Exemplo de solicitação
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

O Google responde a essa solicitação retornando um objeto JSON com um token de acesso de curta duração e um token de atualização.

A resposta contém os seguintes campos:

Campos de resposta
access_token Token de acesso emitido pelo Google que o aplicativo envia para autorizar uma solicitação da API Google
id_token O token de ID contém as informações da Conta do Google do usuário. A seção Validar a resposta contém detalhes sobre como decodificar e validar a resposta do token de ID.
expires_in O ciclo de vida restante do token de acesso em segundos
refresh_token Um token que pode ser usado para receber um novo token de acesso. Os tokens de atualização são válidos até que o usuário revogue o acesso.
scope O valor deste campo é sempre definido como openid para o caso de uso da conta vinculada.
token_type O tipo de token retornado. No momento, o valor deste campo está sempre definido como Bearer
Exemplo de resposta
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Validar a resposta do token de ID

Validate and decode the JWT assertion

You can validate and decode the JWT assertion by using a JWT-decoding library for your language. Use Google's public keys, available in JWK or PEM formats, to verify the token's signature.

When decoded, the JWT assertion looks like the following example:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

In addition to verifying the token's signature, verify that the assertion's issuer (iss field) is https://accounts.google.com, that the audience (aud field) is your assigned client ID, and that the token has not expired (exp field).

Using the email, email_verified and hd fields you can determine if Google hosts and is authoritative for an email address. In cases where Google is authoritative the user is currently known to be the legitimate account owner and you may skip password or other challenges methods. Otherwise, these methods can be used to verify the account prior to linking.

Cases where Google is authoritative:

  • email has a @gmail.com suffix, this is a Gmail account.
  • email_verified is true and hd is set, this is a G Suite account.

Users may register for Google Accounts without using Gmail or G Suite. When email does not contain a @gmail.com suffix and hd is absent Google is not authoritative and password or other challenge methods are recommended to verify the user. email_verfied can also be true as Google initially verified the user when the Google account was created, however ownership of the third party email account may have since changed.