Este documento explica como implementar a autorização OAuth 2.0 para acessar as APIs do Google por apps executados em dispositivos como TVs, consoles de jogos e impressoras. Mais especificamente, esse fluxo foi projetado para dispositivos que não têm acesso a um navegador ou têm recursos de entrada limitados.
O OAuth 2.0 permite que os usuários compartilhem dados específicos com um aplicativo, mantendo a privacidade de nomes, senhas e outras informações. Por exemplo, um aplicativo de TV pode usar o OAuth 2.0 para receber permissão para selecionar um arquivo armazenado no Google Drive.
Como os aplicativos que usam esse fluxo são distribuídos para dispositivos individuais, presume-se que eles não podem manter segredos. Eles podem acessar as APIs do Google enquanto o usuário está presente no app ou quando ele está em execução em segundo plano.
Alternativas
Se você estiver criando um app para uma plataforma como Android, iOS, macOS, Linux ou Windows (incluindo a plataforma Windows Universal), que tenha acesso ao navegador e aos recursos de entrada completos, use o fluxo OAuth 2.0 para aplicativos para dispositivos móveis e computadores. Use esse fluxo mesmo que seu app seja uma ferramenta de linha de comando sem uma interface gráfica.
Se você só quer fazer login com as Contas do Google e usar o token de ID JWT para receber informações básicas do perfil do usuário, consulte Fazer login em TVs e dispositivos de entrada limitados.
Pré-requisitos
Ativar as APIs do projeto
Qualquer aplicativo que chame as APIs do Google precisa ativar essas APIs no .
Para ativar uma API para um projeto, faça o seguinte:
- no .
- O lista todas as APIs disponíveis, agrupadas por família de produtos e popularidade. Se a API que você quer ativar não estiver visível na lista, use a pesquisa para encontrá-la ou clique em Ver tudo na família de produtos a que ela pertence.
- Selecione aquela que você quer habilitar e clique no botão Ativar.
Criar credenciais de autorização
Qualquer aplicativo que use o OAuth 2.0 para acessar as APIs do Google precisa ter credenciais de autorização que identifiquem o aplicativo para o servidor OAuth 2.0 do Google. As etapas a seguir explicam como criar credenciais para seu projeto. Seus aplicativos podem usar as credenciais para acessar as APIs que você ativou para esse projeto.
- Clique em Criar credenciais > ID do cliente OAuth.
- Selecione o tipo de aplicativo TVs e dispositivos de entrada limitados.
- Dê um nome ao cliente OAuth 2.0 e clique em Criar.
Identificar escopos de acesso
Os escopos permitem que seu aplicativo solicite acesso apenas aos recursos necessários, além de permitir que os usuários controlem o nível de acesso que concedem ao seu aplicativo. Portanto, pode haver uma relação inversa entre o número de escopos solicitados e a probabilidade de conseguir o consentimento do usuário.
Antes de começar a implementar a autorização do OAuth 2.0, recomendamos identificar os escopos que o app vai precisar de permissão para acessar.
Consulte a lista de escopos permitidos para apps ou dispositivos instalados.
Como conseguir tokens de acesso do OAuth 2.0
Mesmo que o app seja executado em um dispositivo com recursos de entrada limitados, os usuários precisam ter acesso separado a um dispositivo com recursos de entrada mais avançados para concluir esse fluxo de autorização. O fluxo tem as seguintes etapas:
- O aplicativo envia uma solicitação ao servidor de autorização do Google que identifica os escopos que ele vai solicitar permissão para acessar.
- O servidor responde com várias informações usadas nas etapas seguintes, como um código do dispositivo e um código do usuário.
- Você exibe informações que o usuário pode inserir em um dispositivo separado para autorizar seu app.
- O aplicativo começa a consultar o servidor de autorização do Google para determinar se o usuário autorizou o app.
- O usuário alterna para um dispositivo com recursos de entrada mais avançados, abre um navegador da Web, navega até o URL mostrado na etapa 3 e insere um código que também aparece na etapa 3. O usuário pode conceder (ou negar) o acesso ao seu aplicativo.
- A próxima resposta à solicitação de pesquisa contém os tokens necessários para que o app autorize as solicitações em nome do usuário. Se o usuário recusou o acesso ao seu app, a resposta não contém tokens.
A imagem abaixo ilustra esse processo:
As seções a seguir explicam essas etapas em detalhes. Considerando a variedade de recursos e ambientes
de execução que os dispositivos podem ter, os exemplos mostrados neste documento usam o utilitário de linha de comando
curl
. Esses exemplos precisam ser fáceis de portar para vários idiomas e ambientes de execução.
Etapa 1: solicitar códigos de dispositivo e de usuário
Nesta etapa, o dispositivo envia uma solicitação HTTP POST ao servidor de autorização do Google, em
https://oauth2.googleapis.com/device/code
, que identifica o aplicativo
e os escopos de acesso que ele quer acessar em nome do usuário.
É necessário extrair esse URL do
documento de descoberta usando o
valor de metadados device_authorization_endpoint
. Inclua os seguintes parâmetros de solicitação
HTTP:
Parâmetros | |
---|---|
client_id |
Obrigatório
O ID do cliente do seu aplicativo. Esse valor está no . |
scope |
Obrigatório
Uma lista de escopos delimitada por espaços que identifica os recursos que o aplicativo pode acessar em nome do usuário. Esses valores informam a tela de consentimento que o Google mostra ao usuário. Consulte a lista de Escopos permitidos para apps ou dispositivos instalados. Os escopos permitem que seu aplicativo solicite acesso apenas aos recursos necessários, além de permitir que os usuários controlem o nível de acesso que concedem ao aplicativo. Portanto, há uma relação inversa entre o número de escopos solicitados e a probabilidade de conseguir o consentimento do usuário. |
Exemplos
O snippet a seguir mostra uma solicitação de exemplo:
POST /device/code HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=client_id&scope=email%20profile
Este exemplo mostra um comando curl
para enviar a mesma solicitação:
curl -d "client_id=client_id&scope=email%20profile" \ https://oauth2.googleapis.com/device/code
Etapa 2: processar a resposta do servidor de autorização
O servidor de autorização vai retornar uma das seguintes respostas:
Resposta de sucesso
Se a solicitação for válida, a resposta será um objeto JSON contendo as seguintes propriedades:
Propriedades | |
---|---|
device_code |
Um valor que o Google atribui exclusivamente para identificar o dispositivo que executa o app que solicita
a autorização. O usuário vai autorizar esse dispositivo em outro dispositivo com recursos de entrada
mais avançados. Por exemplo, um usuário pode usar um laptop ou smartphone para autorizar um
app em execução em uma TV. Nesse caso, o device_code identifica a TV.
Esse código permite que o dispositivo que executa o app determine com segurança se o usuário concedeu ou negou o acesso. |
expires_in |
O tempo, em segundos, em que device_code e
user_code são válidos. Se, nesse período, o usuário não concluir o
fluxo de autorização e o dispositivo não consultar para recuperar informações sobre a
decisão do usuário, talvez seja necessário reiniciar o processo a partir da etapa 1. |
interval |
O tempo, em segundos, que o dispositivo precisa esperar entre as solicitações de pesquisa. Por
exemplo, se o valor for 5 , o dispositivo vai enviar uma solicitação de pesquisa ao
servidor de autorização do Google a cada cinco segundos. Consulte a
etapa 3 para mais detalhes. |
user_code |
Um valor que diferencia maiúsculas de minúsculas e identifica ao Google os escopos a que o aplicativo está solicitando acesso. Sua interface vai instruir o usuário a inserir esse valor em um dispositivo separado com recursos de entrada mais avançados. O Google usa o valor para mostrar o conjunto correto de escopos ao solicitar que o usuário conceda acesso ao seu app. |
verification_url |
Um URL para o qual o usuário precisa navegar em um dispositivo separado para entrar no
user_code e conceder ou negar acesso ao seu aplicativo. Sua interface do usuário
também vai mostrar esse valor. |
O snippet a seguir mostra um exemplo de resposta:
{ "device_code": "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8", "user_code": "GQVQ-JKEC", "verification_url": "https://www.google.com/device", "expires_in": 1800, "interval": 5 }
Resposta de cota excedida
Se as solicitações de código do dispositivo excederem a cota associada ao ID do cliente, você vai receber uma resposta 403 com o seguinte erro:
{ "error_code": "rate_limit_exceeded" }
Nesse caso, use uma estratégia de espera para reduzir a taxa de solicitações.
Etapa 3: mostrar o código do usuário
Mostre ao usuário o verification_url
e o user_code
obtidos na etapa 2. Ambos os valores podem conter qualquer caractere imprimível do conjunto de caracteres US-ASCII. O conteúdo
mostrado ao usuário precisa instruir o usuário a navegar até o
verification_url
em um dispositivo separado e inserir o user_code
.
Ao projetar a interface do usuário (IU), siga estas regras:
user_code
- O
user_code
precisa ser exibido em um campo que possa processar 15 caracteres de tamanho 'W'. Em outras palavras, se você conseguir mostrar o códigoWWWWWWWWWWWWWWW
corretamente, a interface é válida. Recomendamos usar esse valor de string ao testar a forma como ouser_code
é mostrado na interface. - O
user_code
diferencia maiúsculas de minúsculas e não pode ser modificado de nenhuma forma, como mudar a caixa ou inserir outros caracteres de formatação.
- O
verification_url
- O espaço em que você mostra o
verification_url
precisa ser largo o suficiente para processar uma string de URL de 40 caracteres. - Não modifique o
verification_url
de nenhuma forma, exceto para remover o esquema de exibição opcionalmente. Se você planeja remover o esquema (por exemplo,https://
) do URL por motivos de exibição, verifique se o app pode processar as varianteshttp
ehttps
.
- O espaço em que você mostra o
Etapa 4: consultar o servidor de autorização do Google
Como o usuário vai usar um dispositivo separado para navegar até a verification_url
e conceder (ou negar) o acesso, o dispositivo solicitante não é notificado automaticamente quando o usuário
responde à solicitação de acesso. Por esse motivo, o dispositivo solicitante precisa consultar o servidor de autorização
do Google para determinar quando o usuário respondeu à solicitação.
O dispositivo solicitante precisa continuar enviando solicitações de pesquisa até receber uma resposta
indicando que o usuário respondeu à solicitação de acesso ou até que o device_code
e o user_code
obtidos na
etapa 2 tenham expirado. O interval
retornado na etapa 2 especifica o tempo, em segundos, para aguardar entre as solicitações.
O URL do endpoint a ser consultado é https://oauth2.googleapis.com/token
. A solicitação de pesquisa
contém os seguintes parâmetros:
Parâmetros | |
---|---|
client_id |
O ID do cliente do seu aplicativo. Esse valor está no . |
client_secret |
A chave secreta do cliente para o client_id fornecido. Esse valor está no
. |
device_code |
O device_code retornado pelo servidor de autorização na
etapa 2. |
grant_type |
Defina esse valor como urn:ietf:params:oauth:grant-type:device_code . |
Exemplos
O snippet a seguir mostra uma solicitação de exemplo:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=client_id& client_secret=client_secret& device_code=device_code& grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code
Este exemplo mostra um comando curl
para enviar a mesma solicitação:
curl -d "client_id=client_id&client_secret=client_secret& \ device_code=device_code& \ grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/token
Etapa 5: o usuário responde ao pedido de acesso
A imagem a seguir mostra uma página semelhante à que os usuários veem ao navegar até a
verification_url
que você exibiu na etapa 3:
Depois de inserir o user_code
e, se ainda não tiver feito login, de fazer login no Google,
o usuário vai ver uma tela de consentimento como a mostrada abaixo:
Etapa 6: processar respostas a solicitações de pesquisa
O servidor de autorização do Google responde a cada solicitação de pesquisa com uma das seguintes respostas:
Acesso concedido
Se o usuário concedeu acesso ao dispositivo (clicando em Allow
na tela de consentimento),
a resposta conterá um token de acesso e um token de atualização. Os tokens permitem que seu dispositivo
acesso às APIs do Google em nome do usuário. A propriedade scope
na resposta determina quais APIs o
dispositivo pode acessar.
Nesse caso, a resposta da API contém os seguintes campos:
Campos | |
---|---|
access_token |
O token que seu aplicativo envia para autorizar uma solicitação de API do Google. |
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. Os tokens de atualização são sempre retornados para dispositivos. |
scope |
Os escopos de acesso concedidos pelo access_token são expressos como uma lista de
strings delimitadas por espaços e diferenciadas por maiúsculas e minúsculas. |
token_type |
O tipo de token retornado. No momento, o valor desse campo é sempre definido como
Bearer . |
O snippet a seguir mostra um exemplo de resposta:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email", "token_type": "Bearer", "refresh_token": "1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Os tokens de acesso têm uma vida útil limitada. Se o aplicativo precisar de acesso a uma API por um longo período, ele poderá usar o token de atualização para receber um novo token de acesso. Se o aplicativo precisar desse tipo de acesso, ele precisará armazenar o token de atualização para uso posterior.
Acesso negado
Se o usuário se recusar a conceder acesso ao dispositivo, a resposta do servidor terá um
código de status de resposta HTTP 403
(Forbidden
). A resposta contém o
seguinte erro:
{ "error": "access_denied", "error_description": "Forbidden" }
Autorização pendente
Se o usuário ainda não tiver concluído o fluxo de autorização, o servidor vai retornar um
código de status de resposta HTTP 428
(Precondition Required
). A resposta
vai conter o seguinte erro:
{ "error": "authorization_pending", "error_description": "Precondition Required" }
Enquetes muito frequentes
Se o dispositivo enviar solicitações de pesquisa com muita frequência, o servidor retornará um código de status de resposta HTTP 403
(Forbidden
). A resposta conterá o seguinte erro:
{ "error": "slow_down", "error_description": "Forbidden" }
Outros erros
O servidor de autorização também retorna erros se a solicitação de pesquisa estiver sem parâmetros obrigatórios
ou tiver um valor de parâmetro incorreto. Essas solicitações geralmente têm um código de status de resposta HTTP
400
(Bad Request
) ou 401
(Unauthorized
). Esses erros incluem:
Erro | Código de status HTTP | Descrição |
---|---|---|
admin_policy_enforced |
400 |
A Conta do Google não consegue autorizar um ou mais escopos solicitados devido às políticas do administrador do Google Workspace. Consulte o artigo de ajuda do administrador do Google Workspace Controlar quais apps internos e de terceiros acessam dados do Google Workspace para mais informações sobre como um administrador pode restringir o acesso a escopos até que o acesso seja concedido explicitamente ao seu ID de cliente OAuth. |
invalid_client |
401 |
O cliente OAuth não foi encontrado. Por exemplo, esse erro ocorre se o
valor do parâmetro O tipo de cliente OAuth está incorreto. Verifique se o tipo de aplicativo para o ID do cliente está definido como TVs e dispositivos de entrada limitados. |
invalid_grant |
400 |
O valor do parâmetro code é inválido, já foi reivindicado ou não pode ser
analisado. |
unsupported_grant_type |
400 |
O valor do parâmetro grant_type é inválido. |
org_internal |
403 |
O ID do cliente OAuth na solicitação faz parte de um projeto que limita o acesso a Contas do Google em uma organização do Google Cloud específica. Confirme a configuração do tipo de usuário para seu aplicativo OAuth. |
Como chamar APIs do Google
Depois que o aplicativo receber um token de acesso, ele poderá usá-lo para fazer chamadas para uma API
do Google em nome de uma determinada
conta de usuário, se os escopos de acesso exigidos pela API tiverem sido concedidos. Para fazer isso, inclua
o token de acesso em uma solicitação para a API incluindo um parâmetro de consulta
access_token
ou um valor Bearer
de cabeçalho HTTP Authorization
. Quando possível,
o cabeçalho HTTP é preferível, porque as strings de consulta tendem a ficar visíveis nos registros do servidor. Na maioria
dos casos, é possível usar uma biblioteca de cliente para configurar suas chamadas para as APIs do Google. Por exemplo, ao
chamar a API Drive Files.
Teste todas as APIs do Google e confira os escopos delas no OAuth 2.0 Playground.
Exemplos de GET HTTP
Uma chamada para o endpoint
drive.files
(a API Drive Files) usando o cabeçalho HTTP
Authorization: Bearer
pode ser semelhante ao seguinte. É necessário especificar seu próprio token de acesso:
GET /drive/v2/files HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
Esta é uma chamada para a mesma API do usuário autenticado usando o parâmetro de string de consulta access_token
:
GET https://www.googleapis.com/drive/v2/files?access_token=access_token
Exemplos de curl
É possível testar esses comandos com o aplicativo de linha de comando curl
. Confira um
exemplo que usa a opção de cabeçalho HTTP (preferencial):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files
Ou, como alternativa, a opção de parâmetro de string de consulta:
curl https://www.googleapis.com/drive/v2/files?access_token=access_token
Atualização do token de acesso
Os tokens de acesso expiram periodicamente e se tornam credenciais inválidas para uma solicitação de API relacionada. É possível atualizar um token de acesso sem solicitar a permissão do usuário (inclusive quando o usuário não está presente) se você solicitou acesso off-line aos escopos associados ao token.
Para atualizar um token de acesso, o aplicativo envia uma solicitação POST
HTTPS ao servidor de autorização do Google (https://oauth2.googleapis.com/token
) que
inclui os seguintes parâmetros:
Campos | |
---|---|
client_id |
O ID do cliente recebido do . |
client_secret |
A chave secreta do cliente obtida do . |
grant_type |
Conforme
definido na
especificação OAuth 2.0,
o valor desse campo precisa ser definido como refresh_token . |
refresh_token |
O token de atualização retornado da troca de código de autorização. |
O snippet a seguir mostra uma solicitação de exemplo:
POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
Enquanto o usuário não tiver revogado o acesso concedido ao aplicativo, o servidor de tokens vai retornar um objeto JSON que contém um novo token de acesso. O snippet a seguir mostra um exemplo de resposta:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/calendar.readonly", "token_type": "Bearer" }
Há limites no número de tokens de atualização que serão emitidos: um limite por combinação de cliente/usuário e outro por usuário em todos os clientes. Salve os tokens de atualização no armazenamento de longo prazo e continue a usá-los enquanto eles permanecerem válidos. Se o aplicativo solicitar muitos tokens de atualização, ele poderá encontrar esses limites. Nesse caso, os tokens de atualização mais antigos vão deixar de funcionar.
Revogar um token
Em alguns casos, o usuário pode querer revogar o acesso concedido a um app. Um usuário pode revogar o acesso acessando as Configurações da conta. Consulte a seção Remover acesso a sites ou apps do documento de suporte "Sites e apps de terceiros com acesso à sua conta" para mais informações.
Também é possível que um aplicativo revogue programaticamente o acesso concedido a ele. A revogação programática é importante em casos em que um usuário cancela a inscrição, remove um aplicativo ou os recursos da API exigidos por um app mudaram significativamente. Em outras palavras, parte do processo de remoção pode incluir uma solicitação de API para garantir que as permissões concedidas anteriormente ao aplicativo sejam removidas.
Para revogar um token de forma programática, seu app faz uma solicitação para
https://oauth2.googleapis.com/revoke
e inclui o token como um parâmetro:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
O token pode ser de acesso ou de atualização. Se o token for de acesso e tiver um token de atualização correspondente, ele também será revogado.
Se a revogação for processada, o código de status HTTP da resposta será
200
. Para condições de erro, um código de status HTTP 400
é retornado com
um código de erro.
Escopos permitidos
O fluxo OAuth 2.0 para dispositivos tem suporte apenas para os seguintes escopos:
OpenID Connect, Login do Google
email
openid
profile
API Drive
https://www.googleapis.com/auth/drive.appdata
https://www.googleapis.com/auth/drive.file
API YouTube
https://www.googleapis.com/auth/youtube
https://www.googleapis.com/auth/youtube.readonly
Como implementar a Proteção entre contas
Outra medida que você pode tomar para proteger as contas dos usuários é implementar a proteção entre contas usando o serviço de proteção entre contas do Google. Esse serviço permite que você se inscreva em notificações de eventos de segurança que fornecem informações ao seu app sobre mudanças importantes na conta do usuário. Em seguida, você pode usar as informações para tomar medidas dependendo de como você decide responder aos eventos.
Confira alguns exemplos de tipos de eventos enviados ao seu app pelo serviço de proteção entre contas do Google:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
-
https://schemas.openid.net/secevent/oauth/event-type/token-revoked
-
https://schemas.openid.net/secevent/risc/event-type/account-disabled
Consulte a página Proteger contas de usuários com a Proteção entre contas para mais informações sobre como implementar a Proteção entre contas e a lista completa de eventos disponíveis.