OpenID Connect

Las APIs de OAuth 2.0 de Google se pueden usar para la autenticación y la autorización. En este documento, se describe nuestra implementación de OAuth 2.0 para la autenticación, que cumple con la especificación de OpenID Connect y cuenta con la certificación de OpenID. La documentación que se encuentra en Usa OAuth 2.0 para acceder a las APIs de Google también se aplica a este servicio. Si deseas explorar este protocolo de forma interactiva, te recomendamos que uses Google OAuth 2.0 Playground. Para obtener ayuda en Stack Overflow, etiqueta tus preguntas con "google-oauth".

Configura OAuth 2.0

Antes de que tu aplicación pueda usar el sistema de autenticación de OAuth 2.0 de Google para el acceso de los usuarios, debes configurar un proyecto en la para obtener credenciales de OAuth 2.0, establecer un URI de redireccionamiento y (opcionalmente) personalizar la información de la marca que tus usuarios ven en la pantalla de consentimiento del usuario. También puedes usar para crear una cuenta de servicio, habilitar la facturación, configurar el filtrado y realizar otras tareas. Para obtener más detalles, consulta la Ayuda.

Obtén credenciales de OAuth 2.0

Necesitas credenciales de OAuth 2.0, incluido un ID de cliente y un secreto del cliente, para autenticar a los usuarios y obtener acceso a las APIs de Google.

Para ver la ID del cliente y el secreto del cliente para una credencial OAuth 2.0 dada, haga clic en el siguiente texto: Seleccionar credencial . En la ventana que se abre, elija su proyecto y la credencial que desea, luego haga clic en Ver .

O vea su ID de cliente y el secreto del cliente desde la página de Credenciales en API Console :

  1. Go to the Credentials page.
  2. Haga clic en el nombre de su credencial o en el ícono de lápiz ( ). Su ID de cliente y secreto están en la parte superior de la página.

Cómo configurar un URI de redireccionamiento

El URI de redireccionamiento que estableces en determina dónde Google envía las respuestas a tus solicitudes de autenticación.

Para crear, ver o editar los URI de redireccionamiento para una credencial de OAuth 2.0 dada, haga lo siguiente:

  1. Go to the Credentials page.
  2. En la sección de ID de cliente OAuth 2.0 de la página, haga clic en una credencial.
  3. Ver o editar los URI de redireccionamiento.

Si no hay una sección de ID de cliente OAuth 2.0 en la página Credenciales, entonces su proyecto no tiene credenciales OAuth. Para crear uno, haga clic en Crear credenciales .

Personaliza la pantalla de consentimiento del usuario

Para tus usuarios, la experiencia de autenticación de OAuth 2.0 incluye una pantalla de consentimiento que describe la información que el usuario divulga y las condiciones que se aplican. Por ejemplo, cuando el usuario accede, es posible que se le solicite que le otorgue a tu app acceso a su dirección de correo electrónico y a la información básica de la cuenta. Solicitas acceso a esta información con el parámetro scope, que tu app incluye en su solicitud de autenticación. También puedes usar los permisos para solicitar acceso a otras APIs de Google.

La pantalla de consentimiento del usuario también presenta información de desarrollo de la marca, como el nombre y el logotipo del producto, y la URL de la página principal. Tú controlas la información de la marca en .

Para habilitar la pantalla de consentimiento de su proyecto:

  1. Abra el Consent Screen page en el Google API Console .
  2. If prompted, select a project, or create a new one.
  3. Rellene el formulario y haga clic en Guardar .

En el siguiente diálogo de consentimiento, se muestra lo que vería un usuario cuando se presenta una combinación de OAuth 2.0 y permisos de Google Drive en la solicitud. (Este diálogo genérico se generó con Google OAuth 2.0 Playground, por lo que no incluye la información de marca que se establecería en ).

Ejemplo de una página de consentimiento
Figura 1: Captura de pantalla de la página de consentimiento

Accede al servicio

Google y terceros proporcionan bibliotecas que puedes usar para encargarte de muchos de los detalles de implementación de la autenticación de usuarios y el acceso a las APIs de Google. Entre los ejemplos, se incluyen los Servicios de identidad de Google y las bibliotecas cliente de Google, que están disponibles para una variedad de plataformas.

Si decides no usar una biblioteca, sigue las instrucciones que se indican en el resto de este documento, en el que se describen los flujos de solicitudes HTTP que subyacen a las bibliotecas disponibles.

Autenticación del usuario

La autenticación del usuario implica obtener un token de ID y validarlo. Los tokens de ID son una función estandarizada de OpenID Connect diseñada para compartir aserciones de identidad en Internet.

Los enfoques más comunes para autenticar a un usuario y obtener un token de ID se denominan flujo de "servidor" y flujo "implícito". El flujo del servidor permite que el servidor de backend de una aplicación verifique la identidad de la persona que usa un navegador o un dispositivo móvil. El flujo implícito se usa cuando una aplicación del cliente (por lo general, una app de JavaScript que se ejecuta en el navegador) necesita acceder a las APIs directamente en lugar de usar su servidor de backend.

En este documento, se describe cómo realizar el flujo del servidor para autenticar al usuario. El flujo implícito es mucho más complicado debido a los riesgos de seguridad que implica el manejo y el uso de tokens en el cliente. Si necesitas implementar un flujo implícito, te recomendamos que uses Google Identity Services.

Flujo del servidor

Asegúrate de configurar tu app en para permitirle usar estos protocolos y autenticar a tus usuarios. Cuando un usuario intenta acceder con Google, debes hacer lo siguiente:

  1. Crea un token de estado antifalsificación
  2. Envía una solicitud de autenticación a Google
  3. Confirma el token de estado antifalsificación
  4. Intercambia code por un token de acceso y un token de ID
  5. Cómo obtener información del usuario a partir del token de ID
  6. Autentica al usuario

1. Crea un token de estado antifalsificación

Debes proteger la seguridad de tus usuarios evitando los ataques de falsificación de solicitudes. El primer paso es crear un token de sesión único que mantenga el estado entre tu app y el cliente del usuario. Más adelante, correlacionarás este token de sesión único con la respuesta de autenticación que devuelve el servicio de acceso con OAuth de Google para verificar que el usuario es quien realiza la solicitud y no un atacante malicioso. Estos tokens suelen denominarse tokens de falsificación de solicitudes entre sitios (CSRF).

Una buena opción para un token de estado es una cadena de unos 30 caracteres construida con un generador de números aleatorios de alta calidad. Otro es un hash que se genera firmando algunas de tus variables de estado de sesión con una clave que se mantiene secreta en tu backend.

En el siguiente código, se muestra cómo generar tokens de sesión únicos.

PHP

Para usar este ejemplo, debes descargar la biblioteca cliente de las APIs de Google para PHP.

// 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

Debes descargar la biblioteca cliente de las APIs de Google para Java para usar esta muestra.

// 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

Debes descargar la biblioteca cliente de las APIs de Google para Python para usar este ejemplo.

# 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. Envía una solicitud de autenticación a Google

El siguiente paso es formar una solicitud GET HTTPS con los parámetros de URI adecuados. Ten en cuenta que se usa HTTPS en lugar de HTTP en todos los pasos de este proceso; las conexiones HTTP se rechazan. Debes recuperar el URI base del documento de Discovery con el valor de metadatos authorization_endpoint. En el siguiente análisis, se supone que el URI base es https://accounts.google.com/o/oauth2/v2/auth.

Para una solicitud básica, especifica los siguientes parámetros:

  • client_id, que obtienes de .
  • response_type, que, en una solicitud básica del flujo de código de autorización, debería ser code. (Obtén más información en response_type).
  • scope, que, en una solicitud básica, debe ser openid email. (Obtén más información en scope).
  • redirect_uri debe ser el endpoint HTTP de tu servidor que recibirá la respuesta de Google. El valor debe coincidir exactamente con uno de los URIs de redireccionamiento autorizados para el cliente de OAuth 2.0 que configuraste en Credentials page. Si este valor no coincide con un URI autorizado, la solicitud fallará con un error redirect_uri_mismatch.
  • state debe incluir el valor del token de sesión único contra falsificaciones, así como cualquier otra información necesaria para recuperar el contexto cuando el usuario regrese a tu aplicación, p.ej., la URL de inicio. (Obtén más información en state).
  • nonce es un valor aleatorio que genera tu app y que habilita la protección contra repeticiones cuando está presente.
  • login_hint puede ser la dirección de correo electrónico del usuario o la cadena sub, que equivale al ID de Google del usuario. Si no proporcionas un login_hint y el usuario accedió, la pantalla de consentimiento incluye una solicitud de aprobación para divulgar la dirección de correo electrónico del usuario a tu app. (Obtén más información en login_hint).
  • Usa el parámetro hd para optimizar el flujo de OpenID Connect para los usuarios de un dominio específico asociado con una organización de Google Workspace o Cloud (obtén más información en hd).

Este es un ejemplo de un URI de autenticación de OpenID Connect completo, con saltos de línea y espacios para facilitar la lectura:

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

Los usuarios deben dar su consentimiento si tu app solicita información nueva sobre ellos o si solicita acceso a la cuenta que no hayan aprobado anteriormente.

3. Confirma el token de estado antifalsificación

La respuesta se envía al redirect_uri que especificaste en la solicitud. Todas las respuestas se devuelven en la cadena de consulta:

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

En el servidor, debes confirmar que el state que recibiste de Google coincida con el token de sesión que creaste en el paso 1. Esta verificación de ida y vuelta ayuda a comprobar que el usuario, y no una secuencia de comandos maliciosa, es quien realiza la solicitud.

En el siguiente código, se muestra cómo confirmar los tokens de sesión que creaste en el paso 1:

PHP

Para usar este ejemplo, debes descargar la biblioteca cliente de las APIs de Google para PHP.

// 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

Debes descargar la biblioteca cliente de las APIs de Google para Java para usar esta muestra.

// 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

Debes descargar la biblioteca cliente de las APIs de Google para Python para usar este ejemplo.

# 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. Intercambia code por un token de acceso y un token de ID

La respuesta incluye un parámetro code, un código de autorización de un solo uso que tu servidor puede intercambiar por un token de acceso y un token de ID. Tu servidor realiza este intercambio enviando una solicitud POST HTTPS. La solicitud POST se envía al extremo del token, que debes recuperar del documento de descubrimiento con el valor de metadatos token_endpoint. En el siguiente análisis, se supone que el extremo es https://oauth2.googleapis.com/token. La solicitud debe incluir los siguientes parámetros en el cuerpo de POST:

Campos
code Es el código de autorización que se devuelve desde la solicitud inicial.
client_id El ID de cliente que obtienes de , como se describe en Obtén credenciales de OAuth 2.0.
client_secret El secreto del cliente que obtienes de , como se describe en Obtén credenciales de OAuth 2.0.
redirect_uri Es un URI de redireccionamiento autorizado para el client_id determinado que se especifica en , como se describe en Cómo establecer un URI de redireccionamiento.
grant_type Este campo debe contener un valor de authorization_code, como se define en la especificación de OAuth 2.0.

La solicitud real podría verse como el siguiente ejemplo:

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

Una respuesta correcta a esta solicitud contiene los siguientes campos en un array JSON:

Campos
access_token Es un token que se puede enviar a una API de Google.
expires_in Es la vida útil restante del token de acceso en segundos.
id_token Un JWT que contiene información de identidad sobre el usuario y que Google firma digitalmente.
scope Permisos de acceso otorgados por access_token, expresados como una lista de cadenas delimitadas por espacios y que distinguen mayúsculas de minúsculas.
token_type Identifica el tipo de token que se devolvió. En este momento, este campo siempre tiene el valor Bearer.
refresh_token (opcional)

Este campo solo está presente si el parámetro access_type se configuró como offline en la solicitud de autenticación. Para obtener más información, consulta Tokens de actualización.

5. Obtén información del usuario a partir del token de ID

Un token de ID es un JWT (token web JSON), es decir, un objeto JSON codificado en Base64 y firmado de forma criptográfica. Normalmente, es fundamental que valides un token de ID antes de usarlo, pero, como te comunicas directamente con Google a través de un canal HTTPS sin intermediarios y usas tu secreto del cliente para autenticarte en Google, puedes tener la certeza de que el token que recibes realmente proviene de Google y es válido. Si tu servidor pasa el ID token a otros componentes de tu app, es extremadamente importante que los otros componentes validen el token antes de usarlo.

Dado que la mayoría de las bibliotecas de API combinan la validación con el trabajo de decodificación de los valores codificados en base64url y el análisis del JSON interno, es probable que termines validando el token de todos modos cuando accedas a las declaraciones en el token de ID.

Carga útil de un token de ID

Un token de ID es un objeto JSON que contiene un conjunto de pares nombre/valor. Este es un ejemplo con formato para facilitar la lectura:

{
  "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"
}

Los tokens de ID de Google pueden contener los siguientes campos (conocidos como declaraciones):

Reclamar Proporcionado Descripción
aud siempre Es el público para el que se generó este token de ID. Debe ser uno de los IDs de cliente de OAuth 2.0 de tu aplicación.
exp siempre Fecha y hora de vencimiento en la que no se debe aceptar el token de ID. Se representa en tiempo de época Unix (segundos enteros).
iat siempre Fecha y hora en que se emitió el token de ID. Se representa en tiempo de época Unix (segundos enteros).
iss siempre Es el identificador del emisor de la respuesta. Siempre https://accounts.google.com o accounts.google.com para los tokens de ID de Google.
sub siempre Es un identificador del usuario, único entre todas las Cuentas de Google y que nunca se reutiliza. Una Cuenta de Google puede tener varias direcciones de correo electrónico en diferentes momentos, pero el valor de sub nunca cambia. Usa sub dentro de tu aplicación como la clave del identificador único del usuario. Longitud máxima de 255 caracteres ASCII que distinguen mayúsculas de minúsculas.
at_hash Es el hash del token de acceso. Proporciona validación de que el token de acceso está vinculado al token de identidad. Si el token de ID se emite con un valor de access_token en el flujo del servidor, este reclamo siempre se incluye. Esta reivindicación se puede usar como un mecanismo alternativo para protegerse contra ataques de falsificación de solicitudes entre sitios, pero si sigues los pasos 1 y 3, no es necesario verificar el token de acceso.
azp El client_id del presentador autorizado Esta reivindicación solo es necesaria cuando la parte que solicita el token de ID no es la misma que el público del token de ID. Este puede ser el caso en Google para las apps híbridas en las que una aplicación web y una app para Android tienen un client_id de OAuth 2.0 diferente, pero comparten el mismo proyecto de las APIs de Google.
email La dirección de correo electrónico del usuario. Se proporciona solo si incluiste el alcance email en tu solicitud. El valor de este reclamo puede no ser único para esta cuenta y podría cambiar con el tiempo, por lo que no debes usarlo como identificador principal para vincularlo a tu registro de usuario. Tampoco puedes depender del dominio del reclamo email para identificar a los usuarios de las organizaciones de Google Workspace o Cloud. En su lugar, usa el reclamo hd.
email_verified Es verdadero si se verificó la dirección de correo electrónico del usuario; de lo contrario, es falso.
family_name Apellido o apellidos del usuario Se puede proporcionar cuando hay un reclamo de name.
given_name Nombre o nombres de pila del usuario. Se puede proporcionar cuando hay un reclamo de name.
hd Es el dominio asociado a la organización de Google Workspace o Cloud del usuario. Se proporciona solo si el usuario pertenece a una organización de Google Cloud. Debes verificar este reclamo cuando restrinjas el acceso a un recurso solo a los miembros de ciertos dominios. La ausencia de este reclamo indica que la cuenta no pertenece a un dominio alojado por Google.
locale Es la configuración regional del usuario, representada por una etiqueta de idioma BCP 47. Se puede proporcionar cuando hay un reclamo de name.
name Nombre completo del usuario, en un formato visible. Se puede proporcionar en los siguientes casos:
  • El alcance de la solicitud incluía la cadena "profile".
  • El token de ID se devuelve desde una actualización del token

Cuando hay reclamos de name, puedes usarlos para actualizar los registros de usuarios de tu app. Ten en cuenta que nunca se garantiza que este reclamo esté presente.

nonce Es el valor de nonce que proporciona tu app en la solicitud de autenticación. Para protegerte contra los ataques de reproducción, debes presentar este valor solo una vez.
picture Es la URL de la foto de perfil del usuario. Se puede proporcionar en los siguientes casos:
  • El alcance de la solicitud incluía la cadena "profile".
  • El token de ID se devuelve desde una actualización del token

Cuando hay reclamos de picture, puedes usarlos para actualizar los registros de usuarios de tu app. Ten en cuenta que nunca se garantiza que este reclamo esté presente.

profile Es la URL de la página de perfil del usuario. Se puede proporcionar en los siguientes casos:
  • El alcance de la solicitud incluía la cadena "profile".
  • El token de ID se devuelve desde una actualización del token

Cuando hay reclamos de profile, puedes usarlos para actualizar los registros de usuarios de tu app. Ten en cuenta que nunca se garantiza que este reclamo esté presente.

6. Autentica al usuario

Después de obtener la información del usuario del token de ID, debes consultar la base de datos de usuarios de tu app. Si el usuario ya existe en tu base de datos, debes iniciar una sesión de aplicación para ese usuario si la respuesta de la API de Google cumple con todos los requisitos de acceso.

Si el usuario no existe en tu base de datos de usuarios, debes redireccionarlo a tu flujo de registro de usuarios nuevos. Es posible que puedas registrar automáticamente al usuario según la información que recibas de Google o, al menos, que puedas completar previamente muchos de los campos que necesitas en tu formulario de registro. Además de la información del token de ID, puedes obtener información adicional del perfil del usuario en nuestros extremos de perfil del usuario.

Temas avanzados

En las siguientes secciones, se describe la API de Google OAuth 2.0 con mayor detalle. Esta información está dirigida a los desarrolladores con requisitos avanzados en torno a la autenticación y la autorización.

Acceso a otras APIs de Google

Una de las ventajas de usar OAuth 2.0 para la autenticación es que tu aplicación puede obtener permiso para usar otras APIs de Google en nombre del usuario (como YouTube, Google Drive, Calendar o Contactos) al mismo tiempo que autenticas al usuario. Para ello, incluye los otros alcances que necesites en la solicitud de autenticación que envíes a Google. Por ejemplo, para agregar el grupo etario del usuario a tu solicitud de autenticación, pasa un parámetro de alcance de openid email https://www.googleapis.com/auth/profile.agerange.read. Se le solicita al usuario de forma adecuada en la pantalla de consentimiento. El token de acceso que recibas de Google permitirá que tu aplicación acceda a todas las APIs relacionadas con los permisos de acceso que solicitaste y que se te otorgaron.

Tokens de actualización

En tu solicitud de acceso a la API, puedes solicitar que se devuelva un token de actualización durante el intercambio de code. Un token de actualización proporciona a tu app acceso continuo a las APIs de Google mientras el usuario no está presente en ella. Para solicitar un token de actualización, agrega el parámetro access_type a offline en tu solicitud de autenticación.

Consideraciones:

  • Asegúrate de almacenar el token de actualización de forma segura y permanente, ya que solo puedes obtener un token de actualización la primera vez que realizas el flujo de intercambio de códigos.
  • Existen límites en la cantidad de tokens de actualización que se emiten: un límite por combinación de cliente y usuario, y otro por usuario en todos los clientes. Si tu aplicación solicita demasiados tokens de actualización, es posible que alcance estos límites, en cuyo caso los tokens de actualización más antiguos dejarán de funcionar.

Para obtener más información, consulta Actualiza un token de acceso (acceso sin conexión).

Puedes solicitarle al usuario que vuelva a autorizar tu app configurando el parámetro prompt en consent en tu solicitud de autenticación. Cuando se incluye prompt=consent, la pantalla de consentimiento se muestra cada vez que tu app solicita autorización de permisos de acceso, incluso si todos los permisos se otorgaron previamente a tu proyecto de APIs de Google. Por este motivo, incluye prompt=consent solo cuando sea necesario.

Para obtener más información sobre el parámetro prompt, consulta prompt en la tabla Parámetros del URI de autenticación.

Parámetros del URI de autenticación

En la siguiente tabla, se proporcionan descripciones más completas de los parámetros que acepta la API de autenticación de OAuth 2.0 de Google.

Parámetro Obligatorio Descripción
client_id (Obligatorio) Es la cadena del ID de cliente que obtienes de , como se describe en Obtén credenciales de OAuth 2.0.
nonce (Obligatorio) Es un valor aleatorio que genera tu app y que habilita la protección contra repeticiones.
response_type (Obligatorio) Si el valor es code, se inicia un flujo de código de autorización básico, que requiere un POST en el extremo del token para obtener los tokens. Si el valor es token id_token o id_token token, se inicia un flujo implícito, lo que requiere el uso de JavaScript en el URI de redireccionamiento para recuperar tokens del identificador de URI #fragment.
redirect_uri (Obligatorio) Determina dónde se envía la respuesta. El valor de este parámetro debe coincidir exactamente con uno de los valores de redireccionamiento autorizados que estableciste en (incluido el esquema HTTP o HTTPS, las mayúsculas y minúsculas, y la barra final "/", si corresponde).
scope (Obligatorio)

El parámetro de alcance debe comenzar con el valor openid y, luego, incluir el valor profile, el valor email o ambos.

Si está presente el valor del alcance profile, es posible que el ID token incluya (pero no se garantiza que lo haga) las reclamaciones profile predeterminadas del usuario.

Si está presente el valor del alcance email, el token de ID incluye las reclamaciones email y email_verified.

Además de estos permisos específicos de OpenID, tu argumento de permiso también puede incluir otros valores de permisos. Todos los valores de alcance deben estar separados por espacios. Por ejemplo, si quisieras tener acceso por archivo al Google Drive de un usuario, tu parámetro de alcance podría ser openid profile email https://www.googleapis.com/auth/drive.file.

Para obtener información sobre los permisos disponibles, consulta Permisos de OAuth 2.0 para las APIs de Google o la documentación de la API de Google que deseas usar.

state (Opcional, pero altamente recomendado)

Es una cadena opaca que se transmite en ambos sentidos en el protocolo, es decir, se devuelve como un parámetro de URI en el flujo básico y en el identificador de URI #fragment en el flujo implícito.

El state puede ser útil para correlacionar solicitudes y respuestas. Dado que tu redirect_uri se puede adivinar, usar un valor de state puede aumentar tu certeza de que una conexión entrante es el resultado de una solicitud de autenticación iniciada por tu app. Si generas una cadena aleatoria o codificas el hash de algún estado del cliente (p.ej., una cookie) en esta variable state, puedes validar la respuesta para verificar que la solicitud y la respuesta se originaron en el mismo navegador. Esto proporciona protección contra ataques como la falsificación de solicitudes entre sitios.

access_type (Opcional) Los valores permitidos son offline y online. El efecto se documenta en Acceso sin conexión. Si se solicita un token de acceso, el cliente no recibe un token de actualización, a menos que se especifique un valor de offline.
display (Opcional) Es un valor de cadena ASCII para especificar cómo el servidor de autorización muestra las páginas de la interfaz de usuario de autenticación y consentimiento. Se especifican los siguientes valores, y los servidores de Google los aceptan, pero no tienen ningún efecto en el comportamiento del flujo del protocolo: page, popup, touch y wap.
hd (Opcional)

Simplificar el proceso de acceso para las cuentas que pertenecen a una organización de Google Cloud Si incluyes el dominio de la organización de Google Cloud (por ejemplo, mycollege.edu), puedes indicar que la IU de selección de cuentas debe optimizarse para las cuentas de ese dominio. Para realizar la optimización para las cuentas de organización de Google Cloud en general en lugar de solo para un dominio de organización de Google Cloud, establece un valor de asterisco (*): hd=*.

No confíes en esta optimización de la IU para controlar quién puede acceder a tu app, ya que las solicitudes del cliente se pueden modificar. Asegúrate de validar que el token de ID devuelto tenga un valor de la reclamación hd que coincida con lo que esperas (p.ej., mycolledge.edu). A diferencia del parámetro de solicitud, la reclamación hd del token de ID se incluye en un token de seguridad de Google, por lo que se puede confiar en el valor.

include_granted_scopes (Opcional) Si este parámetro se proporciona con el valor true y se otorga la solicitud de autorización, la autorización incluirá cualquier autorización anterior otorgada a esta combinación de usuario o aplicación para otros alcances. Consulta Autorización incremental.

Ten en cuenta que no puedes realizar una autorización incremental con el flujo de apps instaladas.

login_hint (Opcional) Cuando tu app sabe qué usuario intenta autenticar, puede proporcionar este parámetro como una sugerencia al servidor de autenticación. Si pasas esta sugerencia, se suprimirá el selector de cuentas y se precompletará el cuadro de correo electrónico en el formulario de acceso o se seleccionará la sesión adecuada (si el usuario usa el acceso múltiple), lo que puede ayudarte a evitar problemas que ocurren si tu app accede a la cuenta de usuario incorrecta. El valor puede ser una dirección de correo electrónico o la cadena sub, que equivale al ID de Google del usuario.
prompt (Opcional) Es una lista de valores de cadena separados por espacios que especifica si el servidor de autorización solicita al usuario que se vuelva a autenticar y otorgue su consentimiento. Los valores posibles son los siguientes:
  • none

    El servidor de autorización no muestra ninguna pantalla de autenticación ni de consentimiento del usuario. Devolverá un error si el usuario aún no se autenticó y no configuró previamente el consentimiento para los permisos solicitados. Puedes usar none para verificar si ya existe la autenticación o el consentimiento.

  • consent

    El servidor de autorización le solicita al usuario su consentimiento antes de devolver información al cliente.

  • select_account

    El servidor de autorización le solicita al usuario que seleccione una cuenta de usuario. Esto permite que un usuario que tiene varias cuentas en el servidor de autorización seleccione entre las cuentas para las que puede tener sesiones actuales.

Si no se especifica ningún valor y el usuario no autorizó el acceso anteriormente, se le mostrará una pantalla de consentimiento.

Cómo validar un token de ID

Debes validar todos los tokens de ID en tu servidor, a menos que sepas que provienen directamente de Google. Por ejemplo, tu servidor debe verificar como auténticos los tokens de ID que recibe de tus apps cliente.

A continuación, se indican algunas situaciones comunes en las que puedes enviar tokens de ID a tu servidor:

  • Envía tokens de ID con solicitudes que deben autenticarse. Los tokens de ID te indican el usuario específico que realiza la solicitud y para qué cliente se otorgó ese token de ID.

Los tokens de ID son sensibles y se pueden usar de forma inadecuada si se interceptan. Debes asegurarte de que estos tokens se manejen de forma segura transmitiéndolos solo a través de HTTPS y solo con datos POST o dentro de los encabezados de solicitud. Si almacenas tokens de ID en tu servidor, también debes hacerlo de forma segura.

Una de las cosas que hace que los tokens de ID sean útiles es el hecho de que puedes pasarlos entre diferentes componentes de tu app. Estos componentes pueden usar un token de ID como un mecanismo de autenticación ligero que autentica la app y el usuario. Sin embargo, antes de que puedas usar la información del token de ID o confiar en ella como una confirmación de que el usuario se autenticó, debes validarla.

La validación de un token de ID requiere varios pasos:

  1. Verifica que la entidad emisora haya firmado correctamente el token de ID. Los tokens emitidos por Google se firman con uno de los certificados que se encuentran en el URI especificado en el valor de metadatos jwks_uri del documento de descubrimiento.
  2. Verifica que el valor del reclamo iss en el token de ID sea igual a https://accounts.google.com o accounts.google.com.
  3. Verifica que el valor de la reclamación aud en el token de ID sea igual al ID de cliente de tu app.
  4. Verifica que no haya pasado la hora de vencimiento (reclamación exp) del token de ID.
  5. Si especificaste un valor del parámetro hd en la solicitud, verifica que el token de ID tenga un reclamo hd que coincida con un dominio aceptado asociado a una organización de Google Cloud.

Los pasos del 2 al 5 solo implican comparaciones de cadenas y fechas que son bastante sencillas, por lo que no las detallaremos aquí.

El primer paso es más complejo y consiste en verificar la firma criptográfica. Para fines de depuración, puedes usar el extremo tokeninfo de Google para comparar el procesamiento local implementado en tu servidor o dispositivo. Supongamos que el valor de tu token de ID es XYZ123. Luego, anularías la referencia del URI https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123. Si la firma del token es válida, la respuesta será la carga útil del JWT en su forma de objeto JSON decodificado.

El extremo tokeninfo es útil para la depuración, pero, para fines de producción, recupera las claves públicas de Google desde el extremo de claves y realiza la validación de forma local. Debes recuperar el URI de las claves del documento de descubrimiento con el valor de metadatos jwks_uri. Las solicitudes al extremo de depuración pueden estar sujetas a limitaciones o a otros errores intermitentes.

Dado que Google cambia sus claves públicas con poca frecuencia, puedes almacenarlas en caché con las directivas de caché de la respuesta HTTP y, en la gran mayoría de los casos, realizar la validación local de manera mucho más eficiente que con el extremo tokeninfo. Esta validación requiere recuperar y analizar certificados, y realizar las llamadas criptográficas adecuadas para verificar la firma. Afortunadamente, hay bibliotecas bien depuradas disponibles en una amplia variedad de lenguajes para lograr esto (consulta jwt.io).

Cómo obtener información del perfil del usuario

Para obtener información adicional del perfil del usuario, puedes usar el token de acceso (que tu aplicación recibe durante el flujo de autenticación) y el estándar OpenID Connect:

  1. Para cumplir con los requisitos de OpenID, debes incluir los valores del alcance de openid profile en tu solicitud de autenticación.

    Si deseas que se incluya la dirección de correo electrónico del usuario, puedes especificar un valor de alcance adicional de email. Para especificar profile y email, puedes incluir el siguiente parámetro en el URI de la solicitud de autenticación:

    scope=openid%20profile%20email
  2. Agrega tu token de acceso al encabezado de autorización y realiza una solicitud GET HTTPS al extremo de userinfo, que debes recuperar del documento de Discovery con el valor de metadatos userinfo_endpoint. La respuesta de userinfo incluye información sobre el usuario, como se describe en OpenID Connect Standard Claims y el valor de metadatos claims_supported del documento de Discovery. Los usuarios o sus organizaciones pueden optar por proporcionar o retener ciertos campos, por lo que es posible que no obtengas información para todos los campos de tus permisos de acceso autorizados.

El documento de descubrimiento

El protocolo OpenID Connect requiere el uso de varios extremos para autenticar usuarios y solicitar recursos, incluidos tokens, información del usuario y claves públicas.

Para simplificar las implementaciones y aumentar la flexibilidad, OpenID Connect permite el uso de un "documento de descubrimiento", un documento JSON que se encuentra en una ubicación conocida y que contiene pares clave-valor que proporcionan detalles sobre la configuración del proveedor de OpenID Connect, incluidos los URI de los extremos de autorización, token, revocación, userinfo y claves públicas. El documento de Discovery para el servicio OpenID Connect de Google se puede recuperar desde la siguiente URL:

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

Para usar los servicios de OpenID Connect de Google, debes codificar de forma rígida el URI del documento de descubrimiento (https://accounts.google.com/.well-known/openid-configuration) en tu aplicación. Tu aplicación recupera el documento, aplica reglas de almacenamiento en caché en la respuesta y, luego, recupera los URI de los extremos según sea necesario. Por ejemplo, para autenticar a un usuario, tu código recuperaría el valor de metadatos authorization_endpoint (https://accounts.google.com/o/oauth2/v2/auth en el siguiente ejemplo) como el URI base para las solicitudes de autenticación que se envían a Google.

A continuación, se muestra un ejemplo de este tipo de documento. Los nombres de los campos son los que se especifican en OpenID Connect Discovery 1.0 (consulta ese documento para conocer sus significados). Los valores son meramente ilustrativos y pueden cambiar, aunque se copian de una versión reciente del documento real de 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"
  ]
}

Es posible que puedas evitar un viaje de ida y vuelta HTTP almacenando en caché los valores del documento de Discovery. Se usan encabezados de almacenamiento en caché HTTP estándar, que se deben respetar.

Bibliotecas cliente

Las siguientes bibliotecas cliente simplifican la implementación de OAuth 2.0, ya que se integran con frameworks populares:

Cumplimiento de OpenID Connect

El sistema de autenticación de OAuth 2.0 de Google admite las funciones requeridas de la especificación de OpenID Connect Core. Cualquier cliente diseñado para funcionar con OpenID Connect debería interoperar con este servicio (con la excepción del objeto de solicitud de OpenID).