A vinculação de contas permite que os titulares de Contas do Google se conectem aos seus serviços e compartilhem dados com o Google de forma rápida, simples e segura.
O login com a 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, que podem fazer login com um clique, sem precisar digitar o nome de usuário e a senha novamente. Isso também reduz as chances de os usuários criarem contas duplicadas no seu serviço.
Requisitos
Para implementar o recurso de login com conta vinculada, você precisa atender aos seguintes requisitos:
- Você tem uma implementação de vinculação 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 do token para processar solicitações de tokens de acesso e de atualização.
- Endpoint userinfo para recuperar informações básicas da conta sobre o usuário vinculado que são exibidas para o usuário durante o processo de login da conta vinculada.
- Você tem um app Android.
Como funciona
Pré-requisito : o usuário já vinculou a Conta do Google à conta dele no seu serviço.
- Você ativa a exibição de contas vinculadas durante o fluxo de login com um toque.
- O usuário recebe uma solicitação de login com um toque com a opção de fazer login no seu serviço com a conta vinculada.
- Se o usuário optar por continuar com a conta vinculada, o Google enviará uma solicitação ao endpoint de 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.
- Você troca o código de autorização do Google por um token de ID do Google, que contém informações sobre a Conta do Google do usuário.
- Seu app também recebe um token de ID quando o fluxo é concluído e você o compara com o identificador do usuário no token de ID recebido pelo servidor para fazer login do usuário no app.
![Fazer login na conta vinculada.](https://developer.android.google.cn/static/identity/legacy/one-tap/images/linked-account-signin.png?hl=pt-br)
Implementar o login com a conta vinculada no seu app Android
Para oferecer suporte ao login com a conta vinculada no seu app Android, siga as instruções no guia de implementação do Android.
Processar solicitações de código de autorização do Google
O Google faz uma solicitação POST para o 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 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 processar os seguintes parâmetros de solicitação:
Parâmetros de endpoint do token | |
---|---|
code |
Obrigatório Código de autorização do Google OAuth2 |
client_id |
Obrigatório: ID do cliente que você emitiu 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. Você vai usar isso para saber o contexto do usuário. |
grant_type |
O valor Obrigatório precisa ser definido como urn:ietf:params:oauth:grant-type:reciprocal . |
O endpoint de troca de token precisa responder à solicitação POST da seguinte maneira:
- Verifique se o
access_token
foi concedido ao Google identificado peloclient_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 ID do Google ou com um código de erro HTTP se a solicitação for inválida.
Resposta HTTP
Pronto
Retornar o 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
Em 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"} |
A solicitação não tem um parâmetro, então o servidor não pode prosseguir com ela. Isso também pode ser retornado se a solicitação incluir um parâmetro sem suporte ou repetir um parâmetro. |
401 | {"error": "invalid_request"} |
A autenticação do cliente falhou, por exemplo, se a solicitação contiver um ID ou uma chave secreta do cliente inválidos. |
401 | {"error": "invalid_token"}
Incluir a autenticação "WWW-Authentication: Bearer" no cabeçalho de resposta |
O token de acesso do parceiro é inválido. |
403 | {"error": "insufficient_permission"}
Incluir a 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 precisa conter os seguintes campos :
Campos de resposta de erro | |
---|---|
error |
String de erro Required |
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 o código de autorização por um token de ID
Você vai precisar trocar o código de autorização recebido por um token de ID 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 ID 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 obtido na página Credenciais do Console de APIs. Geralmente, é a credencial com o nome Novas ações no app Google. |
client_secret |
Obrigatório: a chave secreta do cliente obtida na página de 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 OAuth 2.0, o valor desse campo precisa ser 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 que contém 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 seu aplicativo envia para autorizar uma solicitação de API do Google |
id_token |
O token de ID contém as informações da Conta do Google do usuário. A seção Validar resposta contém detalhes sobre como decodificar e validar a resposta do token de ID. |
expires_in |
A vida útil 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 desse campo é sempre definido como "openid" para o caso de uso de login de conta vinculada. |
token_type |
O tipo de token retornado. No momento, o valor desse campo é 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