Usar modelo de código

La biblioteca de Google Identity Services permite a los usuarios solicitar un código de autorización de Google mediante un flujo de UX de redireccionamiento o ventana emergente basado en el navegador. Esto inicia un flujo seguro de OAuth 2.0 y da como resultado un token de acceso que se usa para llamar a las APIs de Google en nombre de un usuario.

Resumen del flujo de código de autorización de OAuth 2.0:

  • Desde un navegador, mediante un gesto, como un clic en un botón, el propietario de la Cuenta de Google solicita un código de autorización a Google.
  • Google responde enviando un código de autorización único a una devolución de llamada en tu app web de JavaScript que se ejecuta en el navegador del usuario, o que invoca directamente tu extremo de código de autorización mediante un redireccionamiento al navegador.
  • La plataforma de backend aloja un extremo de código de autorización y recibe el código. Después de la validación, este código se intercambia por tokens de acceso y de actualización por usuario mediante una solicitud al extremo del token de Google.
  • Google valida el código de autorización, confirma la solicitud que se originó en tu plataforma segura, emite tokens de acceso y de actualización, y los devuelve mediante una llamada al extremo de acceso que aloja tu plataforma.
  • El extremo de acceso recibe los tokens de acceso y actualización, lo que almacena de forma segura el token de actualización para su uso posterior.

Inicializa un cliente de código

El método google.accounts.oauth2.initCodeClient() inicializa un cliente de código.

Puedes compartir un código de Auth mediante el flujo de usuarios del modo Redireccionamiento o Ventana emergente. Con el modo de redireccionamiento, alojas un extremo de autorización de OAuth2 en tu servidor, y Google redirecciona el usuario-agente a este extremo y comparte el código de autenticación como un parámetro de URL. Para el modo de ventana emergente, debes definir un controlador de devolución de llamada de JavaScript, que envía el código de autorización a tu servidor. Se puede usar para brindar una experiencia del usuario fluida sin que los visitantes tengan que abandonar tu sitio.

A fin de inicializar un cliente para lo siguiente:

  • Redirecciona el flujo de UX, establece ux_mode en redirect y el valor de redirect_uri en el extremo del código de autorización de tu plataforma. El valor debe coincidir exactamente con uno de los URI de redireccionamiento autorizados para el cliente de OAuth 2.0 que configuraste en la Consola de API. También debe cumplir con nuestras Reglas de validación de URI de redireccionamiento.

  • Flujo de UX emergente, establece ux_mode en popup y el valor de callback en el nombre de la función que usarás para enviar códigos de autorización a tu plataforma.

Evita ataques de CSRF

A fin de evitar ataques de falsificación de solicitudes entre sitios (CSRF), se emplean técnicas ligeramente diferentes para los flujos de UX de los modos de redireccionamiento y ventana emergente. Para el modo de redireccionamiento, se usa el parámetro state de OAuth 2.0. Consulta la sección 10.12 de falsificación de solicitudes entre sitios de RFC6749 para obtener más información sobre cómo generar y validar el parámetro state. Con el modo de ventana emergente, agregas un encabezado HTTP personalizado a tus solicitudes y, luego, confirmas en tu servidor que coincida con el valor y el origen esperados.

Elige un modo de UX para ver un fragmento de código que muestre el código de autenticación y el manejo de CSRF:

Modo de redireccionamiento

Inicializa un cliente en el que Google redirecciona el navegador del usuario a tu extremo de autenticación y comparte el código de autenticación como un parámetro de URL.

const client = google.accounts.oauth2.initCodeClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  ux_mode: 'redirect',
  redirect_uri: "https://your.domain/code_callback_endpoint",
  state: "YOUR_BINDING_VALUE"
});

Inicializa un cliente en el que el navegador del usuario reciba un código de autenticación de Google y lo envíe a tu servidor.

const client = google.accounts.oauth2.initCodeClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  ux_mode: 'popup',
  callback: (response) => {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', code_receiver_uri, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    // Set custom header for CRSF
    xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
    xhr.onload = function() {
      console.log('Auth code response: ' + xhr.responseText);
    };
    xhr.send('code=' + response.code);
  },
});

Activa el flujo de código de OAuth 2.0

Llama al método requestCode() del cliente de código para activar el flujo de usuarios:

<button onclick="client.requestCode();">Authorize with Google</button>

Esta acción requerirá que el usuario acceda a una Cuenta de Google y dé su consentimiento para compartir alcances individuales antes de mostrar un código de autorización a tu extremo de redireccionamiento o a tu controlador de devolución de llamada.

Manejo del código de Auth

Google genera un código de autorización único por usuario que recibes y verificas en tu servidor de backend.

Para el modo Popup, el controlador especificado por callback, que se ejecuta en el navegador del usuario, retransmite el código de autorización a un extremo alojado en tu plataforma.

Para el modo de redireccionamiento, se envía una solicitud GET al extremo especificado por redirect_url y se comparte el código de autorización en el parámetro code de la URL. Para recibir el código de autorización, haz lo siguiente:

  • Crea un extremo de autorización nuevo si no tienes una implementación existente.

  • Actualiza tu extremo existente para que acepte solicitudes GET y parámetros de URL. Anteriormente, se usaba una solicitud PUT con el valor del código de autorización en la carga útil.

Extremo de autorización

El extremo del código de autorización debe controlar las solicitudes GET con estos parámetros de cadena de consulta de URL:

Nombre Valor
usuariodeautenticación Solicitud de autenticación de acceso del usuario
código Un código de autorización de OAuth2 generado por Google
HD El dominio alojado de la cuenta de usuario
mensaje Cuadro de diálogo de consentimiento del usuario
permiso Lista separada por espacios de uno o más permisos de OAuth2 que se autorizarán
state Variable de estado de CRSF

Ejemplo de solicitud GET con parámetros de URL a un extremo llamado auth-code y alojado por example.com:

Request URL: https://www.example.com/auth-code?state=42a7bd822fe32cc56&code=4/0AX4XfWiAvnXLqxlckFUVao8j0zvZUJ06AMgr-n0vSPotHWcn9p-zHCjqwr47KHS_vDvu8w&scope=email%20profile%20https://www.googleapis.com/auth/calendar.readonly%20https://www.googleapis.com/auth/photoslibrary.readonly%20https://www.googleapis.com/auth/contacts.readonly%20openid%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile&authuser=0&hd=example.com&prompt=consent

Cuando las bibliotecas de JavaScript anteriores inician el flujo de código de autorización o llamadas directas a extremos de Google OAuth 2.0, se usa una solicitud POST.

Ejemplo de solicitud POST que contiene el código de autorización como una carga útil en el cuerpo de la solicitud HTTP:

Request URL: https://www.example.com/auth-code
Request Payload: 4/0AX4XfWhll-BMV82wi4YwbrSaTPaRpUGpKqJ4zBxQldU\_70cnIdh-GJOBZlyHU3MNcz4qaw

Validar la solicitud

En tu servidor, haz lo siguiente para evitar ataques de CSRF.

Verifica el valor del parámetro state para el modo de redireccionamiento.

Confirma que el encabezado X-Requested-With: XmlHttpRequest esté configurado para el modo de ventana emergente.

Luego, debes obtener los tokens de actualización y acceso de Google solo si verificaste correctamente la solicitud de código de Auth.

Obtén acceso y actualiza tokens

Después de que tu plataforma de backend reciba un código de autorización de Google y verifique la solicitud, usa el código de Auth para obtener tokens de acceso y actualización de Google a fin de realizar llamadas a la API.

Sigue las instrucciones que aparecen a partir del Paso 5: Intercambia el código de autorización para los tokens de acceso y actualización de la guía Cómo usar OAuth 2.0 para aplicaciones de servidor web.

Administra tokens

Tu plataforma almacena de forma segura tokens de actualización. Borra los tokens de actualización almacenados cuando se quiten las cuentas de usuario o se revoque el consentimiento del usuario mediante google.accounts.oauth2.revoke o directamente desde https://myaccount.google.com/permissions.

De manera opcional, puedes considerar RISC para proteger las cuentas de usuarios con la Protección integral de la cuenta.

Por lo general, tu plataforma de backend llamará a las APIs de Google con un token de acceso. Si tu app web también llamará directamente a las APIs de Google desde el navegador del usuario, debes implementar una forma de compartir el token de acceso con tu aplicación web, hacerlo está fuera del alcance de esta guía. Si sigues este enfoque y usas la biblioteca cliente de la API de Google para JavaScript, deberás usar gapi.client.SetToken() para almacenar temporalmente el token de acceso en la memoria del navegador y permitir que la biblioteca llame a las APIs de Google.