Você pode permitir que os usuários façam login no seu app com as Contas do Google deles em dispositivos com recursos de entrada limitados, como TVs conectadas à Internet.
O app exibe um código curto e o URL de login ao usuário. Em seguida, o usuário abre o URL de login em um navegador da Web, insere o código e concede ao app permissão para acessar as informações de login do usuário. Por fim, o app recebe a confirmação e o usuário é conectado.
Para usar esse fluxo de login, o app precisa ser executado em um dispositivo que atenda aos seguintes critérios:
- O dispositivo precisa ser capaz de exibir um URL de 40 caracteres e um código de usuário de 15 caracteres, além de instruções para o usuário.
- O dispositivo precisa estar conectado à Internet.
Receber um ID e uma chave secreta do cliente
Seu app precisa de um ID do cliente OAuth 2.0 e de uma chave secreta do cliente para fazer solicitações aos endpoints de login do Google.
Para localizar o ID do cliente e a chave secreta do cliente do projeto, faça o seguinte:
- Selecione uma credencial do OAuth 2.0 atual ou abra a página Credenciais.
- Se você ainda não fez isso, crie as credenciais do OAuth 2.0 do projeto clicando em Criar credenciais > ID do cliente OAuth e fornecendo as informações necessárias para criar as credenciais.
- Procure o ID do cliente na seção IDs do cliente OAuth 2.0. Para mais detalhes, clique no ID do cliente.
Se você estiver criando um novo ID do cliente, selecione o tipo de aplicativo TVs e dispositivos de entrada limitada.
Receber um código de usuário e um URL de verificação
Quando um usuário solicita um login usando uma Conta do Google, você recebe um código de usuário
e um URL de verificação enviando uma solicitação HTTP POST ao endpoint do dispositivo
OAuth 2.0, https://oauth2.googleapis.com/device/code
. Inclua seu ID do cliente e uma lista dos escopos necessários com a solicitação. Se você quiser que os usuários façam login apenas com as Contas do Google deles, solicite apenas os escopos profile
e email
ou, se quiser solicitar permissão para chamar uma API compatível em nome dos usuários, solicite os escopos necessários, além dos escopos profile
e email
.
Veja a seguir um exemplo de solicitação de um código de usuário:
POST /device/code HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&scope=email%20profile
Utilizando curl
:
curl -d "client_id=YOUR_GOOGLE_CLIENT_ID&scope=email profile" https://oauth2.googleapis.com/device/code
A resposta é retornada como um objeto JSON:
{
"device_code" : "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8",
"user_code" : "GQVQ-JKEC",
"verification_url" : "https://www.google.com/device",
"expires_in" : 1800,
"interval" : 5
}
Seu app mostra os valores user_code
e verification_url
para o usuário
e, ao mesmo tempo, pesquisa o endpoint de login no interval
especificado
até que o usuário faça login ou o horário especificado por expires_in
tenha passado.
Mostrar o código do usuário e o URL de verificação
Depois de receber um código de usuário e o URL de verificação do endpoint do dispositivo, exiba-os e instrua o usuário a abrir o URL e inserir o código de usuário.
Os valores de verification_url
e user_code
estão sujeitos a mudanças. Projete
sua IU de forma a processar os seguintes limites:
user_code
precisa ser exibido em um campo com largura suficiente para processar 15 caracteres de tamanhoW
.- É preciso exibir
verification_url
em um campo com largura suficiente para processar uma string de URL com 40 caracteres.
Ambas as strings podem conter qualquer caractere imprimível do conjunto de caracteres US-ASCII.
Ao exibir a string user_code
, não faça nenhuma modificação
(como mudar o uso de letras maiúsculas ou minúsculas ou inserir outros caracteres de formatação), porque
o app poderá ser corrompido se o formato do código mudar no futuro.
Se quiser, você pode modificar a string verification_url
removendo o esquema do
URL para fins de exibição. Nesse caso, confira se o app consegue
processar as variantes "http" e "https". Não modifique a string
verification_url
de outra forma.
Quando o usuário navegar até o URL de verificação, ele verá uma página semelhante a esta:
Depois que o usuário insere o código, o site de login do Google apresenta uma tela de consentimento semelhante a esta:
Se o usuário clicar em Permitir, seu app poderá receber um token de ID para identificar o usuário, um token de acesso para chamar as APIs do Google e um token de atualização para adquirir novos tokens.
Receber um token de ID e um token de atualização
Depois que o app exibir o código do usuário e o URL de verificação, comece a pesquisar o
endpoint do token (https://oauth2.googleapis.com/token
) com o código do dispositivo
que você recebeu. Pesquise o endpoint do token no intervalo,
em segundos, especificado pelo valor interval
.
Veja a seguir um exemplo de solicitação:
POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
client_id=YOUR_GOOGLE_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0
Utilizando curl
:
curl -d "client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=YOUR_DEVICE_CODE&grant_type=http://oauth.net/grant_type/device/1.0" https://oauth2.googleapis.com/token
Se o usuário ainda não tiver aprovado a solicitação, a resposta será a seguinte:
{
"error" : "authorization_pending"
}
O app precisa repetir essas solicitações a uma taxa que não exceda o valor
de interval
. Se o aplicativo pesquisa muito rapidamente, a resposta é a seguinte:
{
"error" : "slow_down"
}
Depois que o usuário faz login e concede ao app acesso aos escopos solicitados, a resposta à próxima solicitação do app inclui um token de ID, um de acesso e um token de atualização:
{
"access_token": "ya29.AHES6ZSuY8f6WFLswSv0HZLP2J4cCvFSj-8GiZM0Pr6cgXU",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "1/551G1yXUqgkDGnkfFk6ZbjMMMDIMxo3JFc8lY8CAR-Q",
"id_token": "eyJhbGciOiJSUzI..."
}
Ao receber essa resposta, seu app pode decodificar o token de ID para acessar informações básicas do perfil do usuário conectado ou enviar o token de ID ao servidor de back-end do app para se autenticar com segurança no servidor. Além disso, o app pode usar o token de acesso para chamar as APIs do Google que o usuário autorizou.
Tokens de acesso e ID têm ciclos de vida limitados. Para manter o usuário conectado além do ciclo de vida dos tokens, armazene o token de atualização e use-o para solicitar novos tokens.
Extrair informações do perfil de usuário do token de ID
É possível receber informações do perfil sobre o usuário conectado decodificando o token de ID com qualquer biblioteca de decodificação JWT. Por exemplo, usando a biblioteca JavaScript jwt-decode do Auth0:
var user_profile = jwt_decode(<var>id_token</var>);
// The "sub" field is available on all ID tokens. This value is unique for each
// Google account and can be used to identify the user. (But do not send this
// value to your server; instead, send the whole ID token so its authenticity
// can be verified.)
var user_id = user_profile["sub"];
// These values are available when you request the "profile" and "email" scopes.
var user_email = user_profile["email"];
var email_verified = user_profile["email_verified"];
var user_name = user_profile["name"];
var user_photo_url = user_profile["picture"];
var user_given_name = user_profile["given_name"];
var user_family_name = user_profile["family_name"];
var user_locale = user_profile["locale"];
Mais informações
- Para manter os usuários conectados após o ciclo de vida de um token de ID, consulte Atualizar um token de acesso.
- Se for necessário autenticar com um servidor de back-end, consulte Autenticar com um servidor de back-end para informações sobre como fazer isso com segurança.