OpenID Connect

As APIs de OAuth 2.0 do Google podem ser usadas para autenticação e autorização. Este documento descreve nossa implementação do OAuth 2.0 para autenticação, que está em conformidade com a especificação OpenID Connect e tem a certificação do OpenID (links em inglês). A documentação em Como usar o OAuth 2.0 para acessar as APIs do Google também se aplica a esse serviço. Se você quiser explorar esse protocolo de maneira interativa, recomendamos o Google OAuth 2.0 Playground. Para ajuda no Stack Overflow, marque suas perguntas com "google-oauth".

Como configurar o OAuth 2.0

Para que seu aplicativo possa usar o sistema de autenticação OAuth 2.0 do Google para login de usuário, é necessário configurar um projeto no Google API Console para receber credenciais OAuth 2.0, definir um URI de redirecionamento e, opcionalmente, personalizar as informações de marca que os usuários veem na tela de consentimento do usuário. Também é possível usar API Console para criar uma conta de serviço, ativar o faturamento, configurar a filtragem e realizar outras tarefas. Para mais detalhes, consulte a Ajuda doGoogle API Console.

Receber credenciais do OAuth 2.0

Você precisa de credenciais do OAuth 2.0, incluindo ID e chave secreta do cliente, para autenticar usuários e ter acesso às APIs do Google.

Para visualizar o ID do cliente e o segredo do cliente para uma determinada credencial do OAuth 2.0, clique no texto a seguir: Selecione credencial . Na janela que se abre, escolha seu projeto e a credencial desejada e clique em Exibir .

Ou visualize seu ID e segredo do cliente na página Credenciais em API Console :

  1. Go to the Credentials page.
  2. Clique no nome da sua credencial ou no ícone de lápis ( ). Seu ID e segredo do cliente estão na parte superior da página.

Definir um URI de redirecionamento

O URI de redirecionamento definido em API Console determina para onde o Google envia respostas às suas solicitações de autenticação.

To create, view, or edit the redirect URIs for a given OAuth 2.0 credential, do the following:

  1. Go to the Credentials page.
  2. In the OAuth 2.0 client IDs section of the page, click a credential.
  3. View or edit the redirect URIs.

If there is no OAuth 2.0 client IDs section on the Credentials page, then your project has no OAuth credentials. To create one, click Create credentials.

Personalizar a tela de consentimento do usuário

Para os usuários, a experiência de autenticação do OAuth 2.0 inclui uma tela de consentimento com a descrição das informações que o usuário está lançando e dos termos aplicáveis. Por exemplo, quando o usuário faz login, ele pode ser solicitado a conceder ao app acesso ao endereço de e-mail e às informações básicas da conta. Para solicitar acesso a essas informações, use o parâmetro scope, que o app inclui na solicitação de autenticação. Também é possível usar escopos para solicitar acesso a outras APIs do Google.

A tela de consentimento do usuário também apresenta informações de branding, como o nome do produto, o logotipo e um URL da página inicial. Você controla as informações da marca na API Console.

Para ativar a tela de consentimento do seu projeto:

  1. Abra o Consent Screen page no Google API Console .
  2. If prompted, select a project, or create a new one.
  3. Preencha o formulário e clique em Salvar .

A caixa de diálogo de consentimento a seguir mostra o que um usuário verá quando uma combinação de escopos do OAuth 2.0 e do Google Drive estiver presente na solicitação. Essa caixa de diálogo genérica foi gerada usando o Google OAuth 2.0 Playground. Portanto, ela não inclui informações de marca que seriam definidas na API Console.

Captura de tela da página de consentimento

Como acessar o serviço

O Google e terceiros fornecem bibliotecas que você pode usar para cuidar de muitos dos detalhes de implementação da autenticação de usuários e do acesso a APIs do Google. Os exemplos incluem o Google Identity Services e as bibliotecas de cliente do Google, que estão disponíveis para várias plataformas.

Se você optar por não usar uma biblioteca, siga as instruções no restante deste documento, que descreve os fluxos de solicitação HTTP que são a base das bibliotecas disponíveis.

Autenticar o usuário

A autenticação do usuário envolve a obtenção e a validação de um token de ID. Os tokens de ID são um recurso padronizado do OpenID Connect projetado para uso no compartilhamento de declarações de identidade na Internet.

As abordagens mais usadas para autenticar um usuário e conseguir um token de código são chamadas de "servidor" e "implícito". O fluxo de servidor permite que o servidor de back-end de um aplicativo verifique a identidade da pessoa usando um navegador ou dispositivo móvel. O fluxo implícito é usado quando um aplicativo do lado do cliente (normalmente, um aplicativo JavaScript em execução no navegador) precisa acessar as APIs diretamente, e não por meio do servidor back-end.

Este documento descreve como executar o fluxo do servidor para autenticar o usuário. O fluxo implícito é muito mais complicado devido aos riscos de segurança ao manipular e usar tokens no lado do cliente. Se for necessário implementar um fluxo implícito, recomendamos o uso do Google Identity Services.

Fluxo do servidor

Configure seu app no API Console para permitir que ele use esses protocolos e autentique os usuários. Quando um usuário tenta fazer login com o Google, você precisa:

  1. Criar um token de estado anti-falsificação
  2. Enviar uma solicitação de autenticação ao Google
  3. Confirmar o token de estado anti-falsificação
  4. Trocar code por token de acesso e de código
  5. Receber informações do usuário com o token de ID
  6. Autenticar o usuário

1. Criar um token de estado anti-falsificação

Você precisa proteger a segurança dos usuários, evitando ataques de falsificação de solicitações. A primeira etapa é criar um token de sessão exclusivo que mantém o estado entre o app e o cliente do usuário. Posteriormente, você corresponderá a esse token de sessão exclusivo com a resposta de autenticação retornada pelo serviço de login do Google OAuth para verificar se o usuário está fazendo a solicitação e não um invasor. Esses tokens são frequentemente chamados de tokens de falsificação de solicitação entre sites (CSRF, na sigla em inglês).

Uma boa escolha para um token de estado é uma string de aproximadamente 30 caracteres construída com o uso de um gerador de números aleatórios de alta qualidade. Outro é um hash gerado pela assinatura de algumas das variáveis de estado da sessão com uma chave que é mantida em segredo no back-end.

O código a seguir demonstra a geração de tokens exclusivos de sessão.

PHP

É preciso fazer o download da biblioteca de cliente das APIs do Google para PHP para usar esta amostra.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
$state = bin2hex(random_bytes(128/8));
$app['session']->set('state', $state);
// Set the client ID, token state, and application name in the HTML while
// serving it.
return $app['twig']->render('index.html', array(
    'CLIENT_ID' => CLIENT_ID,
    'STATE' => $state,
    'APPLICATION_NAME' => APPLICATION_NAME
));

Java

É preciso fazer o download da biblioteca de cliente das APIs do Google para Java para usar esta amostra.

// Create a state token to prevent request forgery.
// Store it in the session for later validation.
String state = new BigInteger(130, new SecureRandom()).toString(32);
request.session().attribute("state", state);
// Read index.html into memory, and set the client ID,
// token state, and application name in the HTML before serving it.
return new Scanner(new File("index.html"), "UTF-8")
    .useDelimiter("\\A").next()
    .replaceAll("[{]{2}\\s*CLIENT_ID\\s*[}]{2}", CLIENT_ID)
    .replaceAll("[{]{2}\\s*STATE\\s*[}]{2}", state)
    .replaceAll("[{]{2}\\s*APPLICATION_NAME\\s*[}]{2}",
    APPLICATION_NAME);

Python

Faça o download da biblioteca cliente de APIs do Google para Python para usar esta amostra.

# Create a state token to prevent request forgery.
# Store it in the session for later validation.
state = hashlib.sha256(os.urandom(1024)).hexdigest()
session['state'] = state
# Set the client ID, token state, and application name in the HTML while
# serving it.
response = make_response(
    render_template('index.html',
                    CLIENT_ID=CLIENT_ID,
                    STATE=state,
                    APPLICATION_NAME=APPLICATION_NAME))

2. Enviar uma solicitação de autenticação ao Google

A próxima etapa é formar uma solicitação HTTPS GET com os parâmetros de URI apropriados. Observe o uso de HTTPS em vez de HTTP em todas as etapas desse processo. Conexões HTTP são recusadas. Recupere o URI base do documento de descoberta usando o valor de metadados authorization_endpoint. A discussão a seguir pressupõe que o URI base é https://accounts.google.com/o/oauth2/v2/auth.

Para uma solicitação básica, especifique os seguintes parâmetros:

  • client_id, que você recebe do API Console Credentials page.
  • response_type, que em uma solicitação de fluxo do código de autorização básica precisa ser code. Leia mais em response_type.
  • scope, que em uma solicitação básica precisa ser openid email. Saiba mais em scope.
  • redirect_uri precisa ser o endpoint HTTP no servidor que receberá a resposta do Google. O valor precisa corresponder exatamente a um dos URIs de redirecionamento autorizados para o cliente OAuth 2.0, que você configurou em API Console Credentials page. Se esse valor não corresponder a um URI autorizado, a solicitação falhará com um erro redirect_uri_mismatch.
  • state precisa incluir o valor do token de sessão exclusivo de falsificação, bem como qualquer outra informação necessária para recuperar o contexto quando o usuário retornar ao aplicativo, por exemplo, o URL inicial. Saiba mais em state.
  • nonce é um valor aleatório gerado pelo app que ativa a proteção de repetição quando presente.
  • login_hint pode ser o endereço de e-mail do usuário ou a string sub, que é equivalente ao ID do Google do usuário. Se você não fornecer um login_hint e o usuário tiver feito login, a tela de consentimento incluirá uma solicitação de aprovação para liberar o endereço de e-mail do usuário no seu app. Leia mais em login_hint.
  • Use o parâmetro hd para otimizar o fluxo do OpenID Connect para usuários de um domínio específico associado a uma organização do Google Cloud. Leia mais em hd.

Veja um exemplo de um URI completo de autenticação do OpenID Connect, com quebras de linha e espaços para legibilidade:

https://accounts.google.com/o/oauth2/v2/auth?
 response_type=code&
 client_id=424911365001.apps.googleusercontent.com&
 scope=openid%20email&
 redirect_uri=https%3A//oauth2.example.com/code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2-login-demo.example.com%2FmyHome&
 login_hint=jsmith@example.com&
 nonce=0394852-3190485-2490358&
 hd=example.com

Os usuários precisam dar consentimento caso seu app solicite novas informações sobre eles ou se o app solicitar acesso à conta que não tenha sido aprovado anteriormente.

3. Confirmar token de estado anti-falsificação

A resposta é enviada ao redirect_uri que você especificou na solicitação. Todas as respostas são retornadas na string de consulta, conforme mostrado abaixo:

https://oauth2.example.com/code?state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foa2cb.example.com%2FmyHome&code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&scope=openid%20email%20https://www.googleapis.com/auth/userinfo.email

No servidor, você precisa confirmar que o state recebido do Google corresponde ao token de sessão criado na Etapa 1. Essa verificação de ida e volta ajuda a garantir que o usuário, e não um script malicioso, esteja fazendo a solicitação.

O código a seguir demonstra a confirmação dos tokens de sessão que você criou na Etapa 1:

PHP

É preciso fazer o download da biblioteca de cliente das APIs do Google para PHP para usar esta amostra.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if ($request->get('state') != ($app['session']->get('state'))) {
  return new Response('Invalid state parameter', 401);
}

Java

É preciso fazer o download da biblioteca de cliente das APIs do Google para Java para usar esta amostra.

// Ensure that there is no request forgery going on, and that the user
// sending us this connect request is the user that was supposed to.
if (!request.queryParams("state").equals(
    request.session().attribute("state"))) {
  response.status(401);
  return GSON.toJson("Invalid state parameter.");
}

Python

Faça o download da biblioteca cliente de APIs do Google para Python para usar esta amostra.

# Ensure that the request is not a forgery and that the user sending
# this connect request is the expected user.
if request.args.get('state', '') != session['state']:
  response = make_response(json.dumps('Invalid state parameter.'), 401)
  response.headers['Content-Type'] = 'application/json'
  return response

4. Troque code por token de acesso e de ID

A resposta inclui um parâmetro code, um código de autorização único que o servidor pode trocar por um token de acesso e um token de ID. O servidor faz essa troca enviando uma solicitação POST HTTPS. A solicitação POST é enviada para o endpoint de token, que precisa ser recuperado do documento de descoberta usando o valor de metadados token_endpoint. A discussão a seguir pressupõe que o endpoint é https://oauth2.googleapis.com/token. A solicitação precisa incluir os seguintes parâmetros no corpo POST:

Campos
code O código de autorização retornado da solicitação inicial.
client_id O ID do cliente que você recebe do API Console Credentials page, conforme descrito em Receber credenciais do OAuth 2.0.
client_secret A chave secreta do cliente que você recebe do API Console Credentials page, conforme descrito em Receber credenciais do OAuth 2.0.
redirect_uri Um URI de redirecionamento autorizado para o client_id especificado no Credentials pagedo API Console, conforme descrito em Definir um URI de redirecionamento.
grant_type Este campo precisa conter um valor de authorization_code, conforme definido na especificação do OAuth 2.0.

A solicitação real pode ser semelhante ao exemplo a seguir:

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

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your-client-id&
client_secret=your-client-secret&
redirect_uri=https%3A//oauth2.example.com/code&
grant_type=authorization_code

Uma resposta bem-sucedida para essa solicitação contém os seguintes campos em uma matriz JSON:

Campos
access_token Um token que pode ser enviado para uma API do Google.
expires_in A vida útil restante do token de acesso em segundos.
id_token Um JWT que contém informações de identidade do usuário que foi assinado digitalmente pelo Google.
scope Os escopos de acesso concedidos pelo access_token expressos como uma lista de strings delimitadas por espaços, que diferenciam maiúsculas de minúsculas.
token_type Identifica o tipo de token retornado. No momento, esse campo sempre tem o valor Bearer.
refresh_token (opcional)

Este campo só estará presente se o parâmetro access_type tiver sido definido como offline na solicitação de autenticação. Para detalhes, consulte Tokens de atualização.

5. Obter informações do usuário com o token de ID

Um token de código é um JWT (JSON Web Token), ou seja, um objeto JSON codificado em Base64 assinado criptograficamente. Normalmente, é essencial que você valide um token de código antes de usá-lo, mas, como está se comunicando diretamente com o Google por meio de um canal HTTPS sem intermediário e usando sua chave secreta do cliente para se autenticar no Google, você pode ter certeza de que o token recebido é realmente do Google e válido. Se o servidor transmitir o token de código para outros componentes do aplicativo, será extremamente importante que esses componentes validem o token antes de usá-lo.

Como a maioria das bibliotecas de API combina a validação com o trabalho de decodificar os valores codificados em base64url e analisar o JSON, você provavelmente acabará validando o token de qualquer maneira, à medida que acessar as declarações no token de ID.

Payload de um token de ID

Um token de ID é um objeto JSON que contém um conjunto de pares de nome/valor. Veja um exemplo formatado para legibilidade:

{
  "iss": "https://accounts.google.com",
  "azp": "1234987819200.apps.googleusercontent.com",
  "aud": "1234987819200.apps.googleusercontent.com",
  "sub": "10769150350006150715113082367",
  "at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
  "hd": "example.com",
  "email": "jsmith@example.com",
  "email_verified": "true",
  "iat": 1353601026,
  "exp": 1353604926,
  "nonce": "0394852-3190485-2490358"
}

Os tokens de código do Google podem conter os seguintes campos (conhecidos como reivindicações):

Reivindicar Fornecido Descrição
aud sempre O público-alvo desse token de ID. Precisa ser um dos IDs de cliente do OAuth 2.0 do aplicativo.
exp sempre O prazo de validade do token de ID não pode ser aceito. Representado em tempo Unix (segundos inteiros).
iat sempre A hora em que o token de ID foi emitido. Representado em tempo Unix (segundos inteiros).
iss sempre O identificador do emissor da resposta. Sempre https://accounts.google.com ou accounts.google.com para tokens de ID do Google.
sub sempre Um identificador para o usuário, exclusivo entre todas as Contas do Google e nunca reutilizado. Uma Conta do Google pode ter vários endereços de e-mail em diferentes momentos, mas o valor sub nunca é alterado. Use sub no aplicativo como a chave de identificador exclusivo do usuário. Comprimento máximo de 255 caracteres ASCII que diferenciam maiúsculas de minúsculas.
at_hash Hash do token de acesso. Fornece a validação de que o token de acesso está vinculado ao token de identidade. Se o token de ID for emitido com um valor access_token no fluxo do servidor, essa declaração será sempre incluída. Essa declaração pode ser usada como um mecanismo alternativo para proteção contra ataques de falsificação de solicitação entre sites, mas se você seguir a Etapa 1 e a Etapa 3, não será necessário verificar o token de acesso.
azp O client_id do apresentador autorizado. Essa reivindicação só é necessária quando a parte que solicita o token de código não é a mesma que o público-alvo do token de código. Esse pode ser o caso no Google para apps híbridos em que um app da Web e um app Android têm um client_id OAuth 2.0 diferente, mas compartilham o mesmo projeto das APIs do Google.
email O endereço de e-mail do usuário. Talvez esse valor não seja exclusivo do usuário e não seja adequado para uso como chave primária. Fornecido somente se seu escopo incluiu o valor de escopo email.
email_verified Verdadeiro se o endereço de e-mail do usuário tiver sido verificado. Caso contrário, será falso.
family_name Sobrenomes ou sobrenomes do usuário. Pode ser fornecido quando há uma declaração name.
given_name O nome ou o nome do usuário. Pode ser fornecido quando há uma declaração name.
hd O domínio associado à organização do Google Cloud do usuário. Fornecido apenas se o usuário pertencer a uma organização do Google Cloud.
locale A localidade do usuário, representada por uma tag de idioma BCP 47. Pode ser fornecido quando há uma declaração name.
name O nome completo do usuário em formato de exibição. Podem ser fornecidos quando:
  • O escopo da solicitação incluiu a string "profile"
  • O token de código é retornado de uma atualização de token.

Quando há declarações name, é possível usá-las para atualizar os registros do usuário do app. Não há garantia de que essa reivindicação esteja presente.

nonce O valor do nonce fornecido pelo app na solicitação de autenticação. Aplique proteção contra ataques de repetição garantindo que ele seja apresentado apenas uma vez.
picture O URL da foto do perfil do usuário. Podem ser fornecidos quando:
  • O escopo da solicitação incluiu a string "profile"
  • O token de código é retornado de uma atualização de token.

Quando há declarações picture, é possível usá-las para atualizar os registros do usuário do app. Não há garantia de que essa reivindicação esteja presente.

profile O URL da página de perfil do usuário. Podem ser fornecidos quando:
  • O escopo da solicitação incluiu a string "profile"
  • O token de código é retornado de uma atualização de token.

Quando há declarações profile, é possível usá-las para atualizar os registros do usuário do app. Não há garantia de que essa reivindicação esteja presente.

6. Autenticar o usuário

Depois de receber informações do usuário com o token de ID, consulte o banco de dados do usuário do seu aplicativo. Se o usuário já existir no banco de dados, inicie uma sessão de aplicativo para esse usuário se todos os requisitos de login forem atendidos pela resposta da API do Google.

Se o usuário não existir no banco de dados, redirecione o usuário para o fluxo de inscrição de novo usuário. É possível registrar o usuário automaticamente com base nas informações recebidas do Google ou, no mínimo, preencher vários campos necessários no formulário de registro. Além das informações no token de ID, você pode ver informações adicionais do perfil de usuário nos nossos endpoints de perfil de usuário.

Assuntos avançados

As seções a seguir descrevem a API do Google OAuth 2.0 em mais detalhes. Estas informações são destinadas a desenvolvedores com requisitos avançados de autenticação e autorização.

Acesso a outras APIs do Google

Uma das vantagens de usar o OAuth 2.0 para autenticação é que seu aplicativo pode ter permissão para usar outras APIs do Google em nome do usuário (como YouTube, Google Drive, Agenda ou Contatos) ao mesmo tempo em que você autentica o usuário. Para fazer isso, inclua os outros escopos necessários na solicitação de autenticação enviada ao Google. Por exemplo, para adicionar a faixa etária do usuário à sua solicitação de autenticação, transmita um parâmetro de escopo de openid email https://www.googleapis.com/auth/profile.agerange.read. O usuário recebe uma solicitação adequada na tela de consentimento. O token de acesso que você recebe do Google permite acessar todas as APIs relacionadas aos escopos de acesso solicitados e concedidos.

Tokens de atualização

Na sua solicitação de acesso à API, é possível solicitar um token de atualização a ser retornado durante a troca code. Um token de atualização fornece ao seu aplicativo acesso contínuo às APIs do Google enquanto o usuário não está presente no seu aplicativo. Para solicitar um token de atualização, adicione o parâmetro access_type como offline em sua solicitação de autenticação.

Considerações:

  • Armazene o token de atualização de maneira segura e permanente, porque você só pode conseguir um token de atualização na primeira vez que executar o fluxo de troca de código.
  • Há limites para o número de tokens de atualização emitidos: um limite por combinação cliente/usuário e outro por usuário em todos os clientes. Se o aplicativo solicitar muitos tokens de atualização, ele poderá atingir esses limites. Nesse caso, os tokens de atualização mais antigos deixarão de funcionar.

Para mais informações, consulte Atualizar um token de acesso (acesso off-line).

Você pode solicitar que o usuário autorize o app novamente definindo o parâmetro prompt como consent na solicitação de autenticação. Quando prompt=consent é incluído, a tela de consentimento é exibida sempre que seu app solicita autorização de escopos de acesso, mesmo que todos os escopos tenham sido concedidos anteriormente ao projeto das APIs do Google. Por esse motivo, inclua prompt=consent somente quando necessário.

Para saber mais sobre o parâmetro prompt, consulte prompt na tabela Parâmetros de URI de autenticação.

Parâmetros de URI de autenticação

A tabela a seguir fornece descrições mais completas dos parâmetros aceitos pela API de autenticação OAuth 2.0 do Google.

Parâmetro Obrigatório Descrição
client_id (obrigatório) A string do ID do cliente conseguida do API Console Credentials page, conforme descrito em Receber credenciais do OAuth 2.0.
nonce (obrigatório) Um valor aleatório gerado pelo app que ativa a proteção contra repetição.
response_type (obrigatório) Se o valor for code, iniciará um fluxo básico do código de autorização, que exige um POST para que o endpoint receba os tokens. Se o valor for token id_token ou id_token token, iniciará um fluxo implícito, exigindo o uso de JavaScript no URI de redirecionamento para recuperar tokens do identificador de URI #fragment.
redirect_uri (obrigatório) Determina para onde a resposta é enviada. O valor desse parâmetro precisa corresponder exatamente a um dos valores de redirecionamento autorizados que você definiu no API Console Credentials page (incluindo o esquema HTTP ou HTTPS, o caso, e "/", se houver).
scope (obrigatório)

O parâmetro de escopo precisa começar com o valor openid e incluir o valor profile, email ou ambos.

Se o valor do escopo profile estiver presente, o token de ID poderá, mas não tem garantia, incluir as declarações profile padrão do usuário.

Se o valor do escopo email estiver presente, o token de ID incluirá declarações email e email_verified.

Além desses escopos específicos do OpenID, seu argumento de escopo também pode incluir outros valores de escopo. Todos os valores de escopo precisam ser separados por espaço. Por exemplo, se você quiser acesso por arquivo ao Google Drive de um usuário, o parâmetro de escopo pode ser openid profile email https://www.googleapis.com/auth/drive.file.

Para informações sobre os escopos disponíveis, consulte Escopos do OAuth 2.0 para APIs do Google ou a documentação da API que você quer usar.

state (Opcional, mas altamente recomendado)

Uma string opaca que é ida e volta no protocolo. Ou seja, ela é retornada como um parâmetro de URI no fluxo básico e no identificador de URI #fragment no fluxo implícito.

O state pode ser útil para correlacionar solicitações e respostas. Como o redirect_uri pode ser deduzido, usar um valor state pode aumentar a garantia de que uma conexão de entrada é o resultado de uma solicitação de autenticação iniciada pelo app. Se você gerar uma string aleatória ou codificar o hash de algum estado do cliente (por exemplo, um cookie) nessa variável state, poderá validar a resposta para garantir ainda mais que a solicitação e a resposta tenham se originado no mesmo navegador. Isso fornece proteção contra ataques, como falsificação de solicitação entre sites.

access_type (Opcional) Os valores permitidos são offline e online. O efeito é documentado em Acesso off-line. Se um token de acesso estiver sendo solicitado, o cliente não receberá um token de atualização, a menos que um valor de offline seja especificado.
display (Opcional) Um valor de string ASCII para especificar como o servidor de autorização exibe as páginas da autenticação e consentimento do usuário. Os valores a seguir são especificados e aceitos pelos servidores do Google, mas não afetam o comportamento: page, popup, touch e wap.
hd (Opcional)

Simplifique o processo de login em contas de uma organização do Google Cloud. Ao incluir o domínio da organização do Google Cloud (por exemplo, mycollege.edu), você pode indicar que a IU de seleção de conta precisa ser otimizada para contas nesse domínio. Para otimizar as contas da organização do Google Cloud em vez de apenas um domínio da organização, defina um valor de asterisco (*): hd=*.

Não confie nessa otimização da IU para controlar quem pode acessar seu app, já que as solicitações do lado do cliente podem ser modificadas. Valide o token de ID retornado tem um valor de declaração hd que corresponde ao que você espera (por exemplo, mycolledge.edu). Ao contrário do parâmetro de solicitação, a declaração hd do token de ID está dentro de um token de segurança do Google, para que o valor possa ser confiável.

include_granted_scopes (Opcional) Se esse parâmetro for fornecido com o valor true e a solicitação de autorização for concedida, a autorização incluirá todas as autorizações anteriores concedidas a essa combinação de usuário/aplicativo para outros escopos. Consulte Autorização incremental.

Não é possível fazer autorização incremental com o fluxo de app instalado.

login_hint (Opcional) Quando seu app sabe qual usuário está tentando autenticar, ele pode fornecer esse parâmetro como uma dica para o servidor de autenticação. Passar essa dica suprime o seletor de contas e preenche automaticamente a caixa de e-mail no formulário de login ou seleciona a sessão adequada (se o usuário estiver usando o login múltiplo). Isso pode ajudar a evitar problemas que ocorrerão se o app fizer login na conta de usuário errada. O valor pode ser um endereço de e-mail ou a string sub, que é equivalente ao ID do Google do usuário.
prompt (Opcional) Uma lista delimitada por espaço de valores de string que especifica se o servidor de autorização solicita a reautenticação e o consentimento do usuário. Os valores possíveis são:
  • none

    O servidor de autorização não exibe telas de autenticação nem de consentimento do usuário. Ele retornará um erro se o usuário ainda não estiver autenticado e não tiver pré-configurado o consentimento para os escopos solicitados. Use none para verificar a autenticação e/ou o consentimento atuais.

  • consent

    O servidor de autorização solicita o consentimento do usuário antes de retornar informações ao cliente.

  • select_account

    O servidor de autorização solicita que o usuário selecione uma conta de usuário. Isso permite que um usuário com várias contas no servidor de autorização selecione dentre várias contas para as quais ele pode ter sessões atuais.

Se nenhum valor for especificado e o usuário não tiver autorizado o acesso, uma tela de consentimento será exibida.

Como validar um token de ID

Você precisa validar todos os tokens de ID no servidor, a menos que saiba que eles foram enviados diretamente pelo Google. Por exemplo, seu servidor precisa verificar como autêntico todos os tokens de ID que ele recebe dos seus apps cliente.

Veja a seguir situações comuns em que é possível enviar tokens de ID ao servidor:

  • Envio de tokens de ID com solicitações que precisam ser autenticadas. Os tokens de código informam o usuário específico que fez a solicitação e para qual cliente esse token de código foi concedido.

Os tokens de ID são confidenciais e podem ser usados indevidamente se forem interceptados. É preciso garantir que esses tokens sejam processados com segurança, transmitindo-os apenas por HTTPS e somente por dados POST ou dentro de cabeçalhos de solicitação. Se você armazenar tokens de ID no servidor, também precisará armazená-los com segurança.

Uma coisa que torna os tokens de ID úteis é o fato de que eles podem ser passados por diferentes componentes do app. Esses componentes podem usar um token de ID como um mecanismo de autenticação leve que autentica o aplicativo e o usuário. Mas antes de usar as informações no token de ID ou confiar nelas como uma declaração de que o usuário fez a autenticação, é necessário validá-las.

A validação de um token de ID requer várias etapas:

  1. Verifique se o token de código foi assinado corretamente pelo emissor. Os tokens emitidos pelo Google são assinados usando um dos certificados encontrados no URI especificado no valor de metadados jwks_uri do documento de descoberta.
  2. Verifique se o valor da declaração iss no token de ID é igual a https://accounts.google.com ou accounts.google.com.
  3. Verifique se o valor da declaração aud no token de ID é igual ao ID do cliente do seu app.
  4. Verifique se o prazo de validade (reivindicação exp) do token de código não passou.
  5. Se você especificou um valor de hd parameter na solicitação, verifique se o token de ID tem uma declaração hd que corresponda a um domínio aceito associado a uma organização do Google Cloud.

As etapas de 2 a 5 envolvem apenas comparações de string e data que são bastante simples. Portanto, não as detalharemos aqui.

A primeira etapa é mais complexa e envolve a verificação da assinatura criptográfica. Para fins de depuração, você pode usar o endpoint tokeninfo do Google para comparar com o processamento local implementado no servidor ou dispositivo. Suponha que o valor do token de ID seja XYZ123. Em seguida, desfaça a referência do URI https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123. Se a assinatura do token for válida, a resposta será o payload do JWT na forma de objeto JSON decodificado.

O endpoint tokeninfo é útil para depuração, mas, para fins de produção, recupere as chaves públicas do Google do endpoint de chaves e realize a validação localmente. Recupere o URI de chaves do documento de descoberta usando o valor de metadados jwks_uri. As solicitações para o endpoint de depuração podem ser limitadas ou sujeitas a erros intermitentes.

Como o Google altera as chaves públicas com pouca frequência, é possível armazená-las em cache usando as diretivas de cache da resposta HTTP e, na grande maioria dos casos, realizar a validação local com muito mais eficiência do que usando o endpoint tokeninfo. Essa validação requer a recuperação e a análise de certificados e a realização das chamadas criptográficas apropriadas para verificar a assinatura. Felizmente, há bibliotecas bem depuradas disponíveis em uma ampla variedade de linguagens para conseguir isso (consulte jwt.io).

Obtendo informações do perfil do usuário

Para ver mais informações de perfil do usuário, use o token de acesso (que o aplicativo recebe durante o fluxo de autenticação) e o padrão OpenID Connect:

  1. Para estar em conformidade com OpenID, inclua os valores de escopo openid profile em sua solicitação de autenticação.

    Se você quiser que o endereço de e-mail do usuário seja incluído, especifique mais um valor de escopo de email. Para especificar profile e email, inclua o seguinte parâmetro no URI da solicitação de autenticação:

    scope=openid%20profile%20email
  2. Adicione seu token de acesso ao cabeçalho de autorização e faça uma solicitação GET HTTPS para o endpoint de informações do usuário, que precisa ser recuperada do documento de descoberta usando o valor de metadados userinfo_endpoint. A resposta de informações do usuário inclui informações sobre o usuário, conforme descrito em OpenID Connect Standard Claims e o valor de metadados claims_supported do documento de descoberta. Os usuários ou as organizações deles podem optar por fornecer ou reter alguns campos. Portanto, é possível que você não receba informações de todos os campos para os escopos de acesso autorizados.

Documento de descoberta

O protocolo OpenID Connect requer o uso de vários endpoints para autenticar usuários e para solicitar recursos, incluindo tokens, informações do usuário e chaves públicas.

Para simplificar as implementações e aumentar a flexibilidade, o OpenID Connect permite o uso de um "documento de descoberta", um documento JSON encontrado em um local conhecido que contém pares de chave-valor que fornecem detalhes sobre a configuração do provedor do OpenID Connect, incluindo os URIs dos endpoints de autorização, token, revogação, userinfo e chaves públicas. O documento de descoberta para o serviço OpenID Connect do Google pode ser recuperado de:

https://accounts.google.com/.well-known/openid-configuration

Para usar os serviços OpenID Connect do Google, codifique o URI do documento de descoberta (https://accounts.google.com/.well-known/openid-configuration) no seu aplicativo. O aplicativo busca o documento, aplica as regras de armazenamento em cache na resposta e recupera os URIs de endpoints conforme necessário. Por exemplo, para autenticar um usuário, seu código recuperará o valor de metadados authorization_endpoint (https://accounts.google.com/o/oauth2/v2/auth no exemplo abaixo) como o URI base para solicitações de autenticação enviadas ao Google.

Veja um exemplo desse documento. Os nomes dos campos são aqueles especificados em OpenID Connect Discovery 1.0 (consulte o documento para saber o significado deles). Os valores são meramente ilustrativos e podem mudar, embora eles sejam copiados de uma versão recente do documento real do Google Discovery:

{
  "issuer": "https://accounts.google.com",
  "authorization_endpoint": "https://accounts.google.com/o/oauth2/v2/auth",
  "device_authorization_endpoint": "https://oauth2.googleapis.com/device/code",
  "token_endpoint": "https://oauth2.googleapis.com/token",
  "userinfo_endpoint": "https://openidconnect.googleapis.com/v1/userinfo",
  "revocation_endpoint": "https://oauth2.googleapis.com/revoke",
  "jwks_uri": "https://www.googleapis.com/oauth2/v3/certs",
  "response_types_supported": [
    "code",
    "token",
    "id_token",
    "code token",
    "code id_token",
    "token id_token",
    "code token id_token",
    "none"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "scopes_supported": [
    "openid",
    "email",
    "profile"
  ],
  "token_endpoint_auth_methods_supported": [
    "client_secret_post",
    "client_secret_basic"
  ],
  "claims_supported": [
    "aud",
    "email",
    "email_verified",
    "exp",
    "family_name",
    "given_name",
    "iat",
    "iss",
    "locale",
    "name",
    "picture",
    "sub"
  ],
  "code_challenge_methods_supported": [
    "plain",
    "S256"
  ]
}

Você pode evitar uma viagem de ida e volta HTTP armazenando em cache os valores do documento de Descoberta. Os cabeçalhos de cache HTTP padrão são usados e devem ser respeitados.

Bibliotecas de cliente

As seguintes bibliotecas de cliente simplificam a implementação do OAuth 2.0 por meio da integração com frameworks conhecidos:

Compliance com OpenID Connect

O sistema de autenticação OAuth 2.0 do Google é compatível com os recursos obrigatórios da especificação OpenID Connect Core. Qualquer cliente projetado para funcionar com o OpenID Connect deve interoperar com esse serviço, exceto no objeto de solicitação do OpenID.