Login em TVs e dispositivos de entrada limitada

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:

  1. Selecione uma credencial do OAuth 2.0 atual ou abra a página Credenciais.
  2. 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.
  3. 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 tamanho W.
  • É 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:

Conectar um dispositivo inserindo um código

Depois que o usuário insere o código, o site de login do Google apresenta uma tela de consentimento semelhante a esta:

Exemplo de tela de consentimento para um cliente do dispositivo

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