OAuth 2.0 para apps de escritorio y dispositivos móviles

En este documento, se explica cómo las aplicaciones de escritorio (como las que se ejecutan en Windows, macOS o Linux, o las herramientas de interfaz de línea de comandos [CLI]) usan los extremos de OAuth 2.0 de Google para autorizar el acceso a la API de YouTube Data.

OAuth 2.0 permite que los usuarios compartan datos específicos con una aplicación y, al mismo tiempo, mantengan la privacidad de sus nombres de usuario, contraseñas y otra información. Por ejemplo, una aplicación puede usar OAuth 2.0 para obtener permiso y subir videos al canal de YouTube de un usuario.

Las aplicaciones de escritorio se instalan de forma local en la máquina de un usuario (como software de escritorio independiente, herramientas de CLI para desarrolladores, utilidades de sincronización en segundo plano o secuencias de comandos). Debido a que estas apps se distribuyen a dispositivos individuales, se supone que no pueden mantener secretos (son clientes públicos). Pueden acceder a las APIs de Google mientras el usuario interactúa de forma activa con la app o cuando esta se ejecuta en segundo plano.

Este flujo de autorización es similar al que se usa para las aplicaciones de servidor web. La principal diferencia es que las apps para computadoras deben abrir el navegador del sistema y proporcionar un URI de redireccionamiento local (como una dirección IP de bucle invertido) para controlar las respuestas del servidor de autorización de Google.

Bibliotecas y muestras

Te recomendamos que uses las bibliotecas cliente de la API de Google para tu lenguaje de programación (p.ej., Python, Java, Node.js, Go o .NET) cuando implementes OAuth 2.0 en aplicaciones para computadoras. Las bibliotecas cliente controlan la autorización de los usuarios y la administración de tokens, lo que hace que la implementación sea más sencilla y menos propensa a errores que usar directamente los extremos HTTP/REST de nivel inferior.

En el caso de las apps para dispositivos móviles, consulta las guías de autorización de Android y de iOS.

En el caso de las apps que se ejecutan en dispositivos que no admiten un navegador del sistema o que tienen capacidades de entrada limitadas, como TVs, consolas de juegos, cámaras o impresoras, consulta OAuth 2.0 para TVs y dispositivos o Acceso en TVs y dispositivos de entrada limitada.

Requisitos previos

Habilita las API para tu proyecto.

Cualquier aplicación que llame a las APIs de Google debe habilitar esas APIs en la Consola de APIs.

Para habilitar una API en tu proyecto, sigue estos pasos:

  1. Abre la Biblioteca de APIs en la Consola de APIs de Google.
  2. Si se te solicita, selecciona un proyecto o crea uno nuevo.
  3. Usa la página Biblioteca para buscar y habilitar la API de YouTube Data. Busca cualquier otra API que usará tu aplicación y habilítala también.

Crea credenciales de autorización

Cualquier aplicación que use OAuth 2.0 para acceder a las APIs de Google debe tener credenciales de autorización que identifiquen la aplicación ante el servidor de OAuth 2.0 de Google. En los siguientes pasos, se explica cómo crear credenciales para tu proyecto. Luego, tus aplicaciones pueden usar las credenciales para acceder a las APIs que habilitaste para ese proyecto.

  1. Ve a la página Clientes.
  2. Haz clic en Crear cliente.
  3. Selecciona el tipo de aplicación App para computadoras.
  4. En el campo Nombre, ingresa un nombre para el cliente de OAuth. Este nombre se muestra en la página Clientes de tu proyecto para identificar al cliente.
  5. Haz clic en Crear.

Tu ID de cliente y tu secreto de cliente se generan y se muestran en la consola de Google Cloud. Las apps para computadoras son clientes públicos y no pueden mantener los secretos confidenciales. Usa siempre PKCE (clave de prueba para el intercambio de código) cuando solicites códigos de autorización.

Identificar los permisos de acceso

Los permisos permiten que tu aplicación solo solicite acceso a los recursos que necesita y, al mismo tiempo, permiten que los usuarios controlen la cantidad de acceso que otorgan a tu aplicación. Por lo tanto, puede haber una relación inversa entre la cantidad de permisos solicitados y la probabilidad de obtener el consentimiento del usuario.

Antes de comenzar a implementar la autorización de OAuth 2.0, te recomendamos que identifiques los permisos a los que tu app necesitará acceder.

La API de YouTube Data v3 usa los siguientes permisos:

Alcance Descripción
https://www.googleapis.com/auth/youtube Administrar tu cuenta de YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator Ver una lista de los miembros actuales y activos de su canal, su nivel actual y el momento en que se hicieron miembros
https://www.googleapis.com/auth/youtube.force-ssl Vea, edite y borre de forma permanente sus videos, calificaciones, comentarios y subtítulos de YouTube
https://www.googleapis.com/auth/youtube.readonly Permite ver tu cuenta de YouTube.
https://www.googleapis.com/auth/youtube.upload Permite administrar tus videos de YouTube.
https://www.googleapis.com/auth/youtubepartner Ver y administrar sus elementos y el contenido asociado en YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit Ver información privada de tu canal de YouTube que sea relevante durante el proceso de auditoría con un socio de YouTube

El documento Permisos de la API de OAuth 2.0 contiene una lista completa de los permisos que puedes usar para acceder a las APIs de Google.

Obtén tokens de acceso de OAuth 2.0

En los siguientes pasos, se muestra cómo interactúa tu aplicación con el servidor de OAuth 2.0 de Google para obtener el consentimiento de un usuario para realizar una solicitud a la API en su nombre. Tu aplicación debe tener ese consentimiento antes de poder ejecutar una solicitud a la API de Google que requiera la autorización del usuario.

Paso 1: Genera un verificador de código y un desafío

Google admite el protocolo de clave de prueba para el intercambio de código (PKCE) para que el flujo de la app instalada sea más seguro. Se crea un verificador de código único para cada solicitud de autorización, y su valor transformado, llamado "code_challenge", se envía al servidor de autorización para obtener el código de autorización.

Crea el verificador de código

Un code_verifier es una cadena aleatoria criptográfica de alta entropía que usa los caracteres no reservados [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~", con una longitud mínima de 43 caracteres y una longitud máxima de 128 caracteres.

El verificador de código debe tener suficiente entropía para que sea imposible adivinar el valor.

Crea el desafío de código

Se admiten dos métodos para crear el desafío de código.

Métodos de generación de desafíos de código
S256 (recomendado) El desafío de código es el hash SHA256 codificado en Base64URL (sin relleno) del verificador de código.
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
plain El desafío de código es el mismo valor que el verificador de código generado anteriormente.
code_challenge = code_verifier

Paso 2: Envía una solicitud al servidor de OAuth 2.0 de Google

Para obtener la autorización del usuario, envía una solicitud al servidor de autorización de Google en https://accounts.google.com/o/oauth2/v2/auth. Este extremo controla la búsqueda de sesiones activas, autentica al usuario y obtiene su consentimiento. Solo se puede acceder al extremo a través de SSL y rechaza las conexiones HTTP (que no son SSL).

El servidor de autorización admite los siguientes parámetros de cadena de consulta para las aplicaciones instaladas:

Parámetros
client_id Obligatorio

Es el ID de cliente de tu aplicación. Puedes encontrar este valor en la página Clientes de la consola de Cloud.

redirect_uri Obligatorio

Determina cómo el servidor de autorización de Google envía una respuesta a tu app. Existen varias opciones de redireccionamiento disponibles para las apps instaladas, y deberás configurar tus credenciales de autorización con un método de redireccionamiento específico.

El valor debe coincidir exactamente con uno de los URI de redireccionamiento autorizados para el cliente de OAuth 2.0, que configuraste en la página Clientes de la consola de Cloud de tu cliente. Si este valor no coincide con un URI autorizado, recibirás un error redirect_uri_mismatch.

En la tabla, se muestra el valor del parámetro redirect_uri adecuado para cada método:

Valores redirect_uri
Esquema de URI personalizado com.example.app:redirect_uri_path

o

com.googleusercontent.apps.123:redirect_uri_path
  • com.example.app es la notación de DNS inversa de un dominio que controlas. El esquema personalizado debe contener un punto para ser válido.
  • com.googleusercontent.apps.123 es la notación de DNS inversa del ID de cliente.
  • redirect_uri_path es un componente de ruta de acceso opcional, como /oauth2redirect. Ten en cuenta que la ruta de acceso debe comenzar con una sola barra, que es diferente de las URLs HTTP normales.
Dirección IP de bucle invertido http://127.0.0.1:port o http://[::1]:port

Consulta tu plataforma para obtener la dirección IP de bucle invertido pertinente y, luego, inicia un objeto de escucha HTTP en un puerto disponible aleatorio. Sustituye port por el número de puerto real en el que escucha tu app.

Ten en cuenta que la compatibilidad con la opción de redireccionamiento de la dirección IP de bucle invertido en las apps para dispositivos móviles está OBSOLETA.

response_type Obligatorio

Determina si el extremo de Google OAuth 2.0 devuelve un código de autorización.

Establece el valor del parámetro en code para las aplicaciones instaladas.

scope Obligatorio

Es una lista de permisos delimitada por espacios que identifica los recursos a los que tu aplicación podría acceder en nombre del usuario. Estos valores informan la pantalla de consentimiento que Google muestra al usuario.

Los permisos permiten que tu aplicación solo solicite acceso a los recursos que necesita y, al mismo tiempo, que los usuarios controlen la cantidad de acceso que otorgan a tu aplicación. Por lo tanto, existe una relación inversa entre la cantidad de permisos solicitados y la probabilidad de obtener el consentimiento del usuario.

La API de YouTube Data v3 usa los siguientes permisos:

Alcance Descripción
https://www.googleapis.com/auth/youtube Administrar tu cuenta de YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator Ver una lista de los miembros actuales y activos de su canal, su nivel actual y el momento en que se hicieron miembros
https://www.googleapis.com/auth/youtube.force-ssl Vea, edite y borre de forma permanente sus videos, calificaciones, comentarios y subtítulos de YouTube
https://www.googleapis.com/auth/youtube.readonly Permite ver tu cuenta de YouTube.
https://www.googleapis.com/auth/youtube.upload Permite administrar tus videos de YouTube.
https://www.googleapis.com/auth/youtubepartner Ver y administrar sus elementos y el contenido asociado en YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit Ver información privada de tu canal de YouTube que sea relevante durante el proceso de auditoría con un socio de YouTube

En el documento Permisos de la API de OAuth 2.0, se proporciona una lista completa de los permisos que puedes usar para acceder a las APIs de Google.

code_challenge Recomendado

Especifica un code_verifier codificado que se usará como desafío del servidor durante el intercambio de código de autorización. Consulta Crea un desafío de código para obtener más información.

code_challenge_method Recomendado

Especifica qué método se usó para codificar un code_verifier que se usará durante el intercambio de código de autorización. Este parámetro se debe usar con el parámetro code_challenge. El valor predeterminado de code_challenge_method es plain si no está presente en la solicitud que incluye un code_challenge. Los únicos valores admitidos para este parámetro son S256 o plain.

state Recomendado

Especifica cualquier valor de cadena que use tu aplicación para mantener el estado entre la solicitud de autorización y la respuesta del servidor de autorización. El servidor devuelve el valor exacto que envías como un par name=value en el identificador de fragmento de URL (#) del redirect_uri después de que el usuario otorga o rechaza la solicitud de acceso de tu aplicación.

Puedes usar este parámetro para varios fines, como dirigir al usuario al recurso correcto en tu aplicación, enviar nonces y mitigar la falsificación de solicitudes entre sitios. Como se puede adivinar tu redirect_uri, usar un valor state puede aumentar la seguridad de que una conexión entrante es el resultado de una solicitud de autenticación. Si generas una cadena aleatoria o codificas el hash de una cookie o de otro valor que capture el estado del cliente, puedes validar la respuesta para garantizar, además, que la solicitud y la respuesta se originaron en el mismo navegador, lo que proporciona protección contra ataques como la falsificación de solicitudes entre sitios. Consulta la documentación de OpenID Connect para ver un ejemplo de cómo crear y confirmar un token de state.

login_hint Opcional

Si tu aplicación sabe qué usuario intenta autenticarse, puede usar este parámetro para proporcionar una sugerencia al servidor de autenticación de Google. El servidor usa la sugerencia para simplificar el flujo de acceso, ya sea completando previamente el campo de correo electrónico en el formulario de acceso o seleccionando la sesión de acceso múltiple adecuada.

Establece el valor del parámetro en una dirección de correo electrónico o un identificador de sub, que es equivalente al ID de Google del usuario.

URLs de autorización de muestra

En las siguientes pestañas, se muestran URLs de autorización de ejemplo para las diferentes opciones de URI de redireccionamiento.

Cada URL solicita acceso a un permiso que permite ver la cuenta de YouTube del usuario.

Las URLs son idénticas, excepto por el valor del parámetro redirect_uri. Las URLs también contienen los parámetros obligatorios response_type y client_id, así como el parámetro opcional state. Cada URL contiene saltos de línea y espacios para facilitar la lectura.

Esquema de URI personalizado

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=com.example.app%3A/oauth2redirect&
 client_id=client_id

Dirección IP de bucle invertido

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=http%3A//127.0.0.1%3A9004&
 client_id=client_id

Paso 3: Google solicita el consentimiento del usuario

En este paso, el usuario decide si otorgará a tu aplicación el acceso solicitado. En esta etapa, Google muestra una ventana de consentimiento con el nombre de tu aplicación y los servicios de la API de Google a los que solicita permiso para acceder con las credenciales de autorización del usuario, además de un resumen de los permisos de acceso que se otorgarán. Luego, el usuario puede dar su consentimiento para otorgar acceso a uno o más permisos que solicita tu aplicación o rechazar la solicitud.

En esta etapa, tu aplicación no necesita hacer nada mientras espera la respuesta del servidor de OAuth 2.0 de Google que indica si se otorgó algún acceso. Esa respuesta se explica en el siguiente paso.

Errores

Las solicitudes al extremo de autorización de OAuth 2.0 de Google pueden mostrar mensajes de error para el usuario en lugar de los flujos de autenticación y autorización esperados. Los códigos de error comunes y las soluciones sugeridas son los siguientes:

admin_policy_enforced

La Cuenta de Google no puede autorizar uno o más permisos solicitados debido a las políticas de su administrador de Google Workspace. Consulta el artículo de ayuda para administradores de Google Workspace Controla qué apps internas y de terceros acceden a los datos de Google Workspace para obtener más información sobre cómo un administrador puede restringir el acceso a todos los permisos o a los permisos sensibles y restringidos hasta que se otorgue acceso de forma explícita a tu ID de cliente de OAuth.

disallowed_useragent

El extremo de autorización se muestra dentro de un usuario-agente incorporado que no está permitido por las políticas de OAuth 2.0 de Google.

Los desarrolladores de iOS y macOS pueden encontrar este error cuando abren solicitudes de autorización en WKWebView. En su lugar, los desarrolladores deben usar bibliotecas de iOS, como Acceso con Google para iOS o AppAuth para iOS de OpenID Foundation.

Los desarrolladores web pueden encontrar este error cuando una app para iOS o macOS abre un vínculo web general en un usuario-agente incorporado y un usuario navega al extremo de autorización de OAuth 2.0 de Google desde tu sitio. Los desarrolladores deben permitir que los vínculos generales se abran en el controlador de vínculos predeterminado del sistema operativo, que incluye los controladores de vínculos universales o la app de navegador predeterminada. La biblioteca SFSafariViewController también es una opción compatible.

org_internal

El ID de cliente de OAuth de la solicitud forma parte de un proyecto que limita el acceso a las Cuentas de Google en una organización de Google Cloud específica. Para obtener más información sobre esta opción de configuración, consulta la sección Tipo de usuario en el artículo de ayuda Configura tu pantalla de consentimiento de OAuth.

deleted_client

Se borró el cliente de OAuth que se usaba para realizar la solicitud. La eliminación puede ocurrir de forma manual o automática en el caso de clientes sin usar . Los clientes borrados se pueden restablecer en un plazo de 30 días a partir de la eliminación. Obtén más información .

invalid_grant

Si usas un verificador y un desafío de código, el parámetro code_callenge no es válido o falta. Asegúrate de que el parámetro code_challenge esté configurado correctamente.

Cuando se actualiza un token de acceso, es posible que el token haya vencido o se haya invalidado. Vuelve a autenticar al usuario y solicita su consentimiento para obtener tokens nuevos. Si sigues viendo este error, asegúrate de que tu aplicación se haya configurado correctamente y de que estés usando los tokens y parámetros correctos en tu solicitud. De lo contrario, es posible que se haya borrado o inhabilitado la cuenta de usuario.

redirect_uri_mismatch

El redirect_uri que se pasa en la solicitud de autorización no coincide con un URI de redireccionamiento autorizado para el ID de cliente de OAuth. Revisa los URIs de redireccionamiento autorizados en la página Clientes de la consola de Google Cloud.

Es posible que el redirect_uri que se pasó no sea válido para el tipo de cliente.

Es posible que el parámetro redirect_uri haga referencia al flujo fuera de banda (OOB) de OAuth que dejó de estar disponible y ya no es compatible. Consulta la guía de migración para actualizar tu integración.

invalid_request

Se produjo un error con la solicitud que realizaste. Esto podría deberse a varios motivos:

  • La solicitud no tiene el formato correcto
  • Faltaban parámetros obligatorios en la solicitud
  • La solicitud usa un método de autorización que Google no admite. Verifica que tu integración de OAuth use un método de integración recomendado
  • Se usó un esquema personalizado no compatible para el URI de redireccionamiento. Si ves el mensaje de error El esquema de URI personalizado no es compatible con las apps para Android o Apps de Chrome, obtén más información sobre las alternativas de esquema de URI personalizado.

Paso 4: Controla la respuesta del servidor de OAuth 2.0

La forma en que tu aplicación recibe la respuesta de autorización depende del esquema de URI de redireccionamiento que use. Independientemente del esquema, la respuesta contendrá un código de autorización (code) o un error (error). Por ejemplo, error=access_denied indica que el usuario rechazó la solicitud.

Si el usuario otorga acceso a tu aplicación, puedes intercambiar el código de autorización por un token de acceso y un token de actualización, como se describe en el siguiente paso.

Paso 5: Intercambia el código de autorización por tokens de acceso y de actualización

Para intercambiar un código de autorización por un token de acceso, llama al extremo https://oauth2.googleapis.com/token y establece los siguientes parámetros:

Campos
client_id Es el ID de cliente que se obtiene de la página Clientes de la consola de Cloud.
client_secret Opcional

Es el secreto del cliente que se obtiene de la página Clientes de la consola de Cloud.

code Es el código de autorización que se muestra en la solicitud inicial.
code_verifier El verificador de código que creaste en el paso 1
grant_type Como se define en la especificación de OAuth 2.0, el valor de este campo debe establecerse en authorization_code.
redirect_uri Es uno de los URI de redireccionamiento que se indican para tu proyecto en la página Clientes de la consola de Cloud para el client_id determinado.

Si bien el uso de DPoP es opcional, se recomienda para aumentar la seguridad. La seguridad de DPoP se basa en que la clave privada esté restringida a un solo dispositivo. Recomendamos almacenarla de forma que no se pueda copiar fuera del dispositivo, por ejemplo, con TPM, Secure Enclaves o cualquier otro almacén de claves respaldado por hardware. Para usar DPoP, tu aplicación debe generar un JWT de prueba de DPoP nuevo y único para cada solicitud al extremo del token y agregarlo como un encabezado de la solicitud HTTP.

Encabezado Obligatorio Descripción
DPoP Opcional Una prueba de DPoP es un JWT que demuestra la posesión de una clave privada. Este es un encabezado, no un parámetro. Si se proporciona, los tokens devueltos se vinculan a esta clave. Se debe generar una prueba nueva y única para cada solicitud, y debe incluir las reclamaciones htm (método HTTP) y htu (URI HTTP) que coincidan con la solicitud.

En el siguiente fragmento, se muestra una solicitud de ejemplo:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6Ik\
 VDIiwieCI6Imw4dEZyaHgtMzR0VjNoUklDUkRZOXpDa0RscEJoRjQyVVFVZldWQVdCR\
 nMiLCJ5IjoiOVZFNGpmX09rX282NHpiVFRsY3VOSmFqSG10NnY5VERWclUwQ2R2R1JE\
 QSIsImNydiI6IlAtMjU2In19.eyJqdGkiOiItQndDM0VTYzZhY2MybFRjIiwiaHRtIj\
 oiUE9TVCIsImh0dSI6Imh0dHBzOi8vc2VydmVyLmV4YW1wbGUuY29tL3Rva2VuIiwia\
 WF0IjoxNTYyMjYyNjE2fQ.2-GxA6T8lP4vfrg8v-FdWP0A0zdrj8igiMLvqRMUvwnQg\
 4PtFLbdLXiOSsX0x7NVY-FNyJK70nfbV37xRZT3Lg

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
redirect_uri=http://127.0.0.1:9004&
grant_type=authorization_code

Crea una prueba de DPoP

En los siguientes pasos, se muestra cómo construir una prueba de DPoP con OpenSSL desde la línea de comandos:

  1. Genera un par de claves EC P-256:
    openssl ecparam -name prime256v1 -genkey -noout -out dpop_private.pem
    openssl ec -in dpop_private.pem -pubout -out dpop_public.pem
  2. Crea el encabezado de DPoP:

    El encabezado debe incluir las reclamaciones typ, alg y jwk (clave pública). Los valores x y y son las coordenadas codificadas en Base64Url de tu clave pública de EC. Codifica este JSON en Base64Url:

    {
      "typ":"dpop+jwt",
      "alg":"ES256",
      "jwk": {
        "kty":"EC",
        "x":"YOUR_PUBLIC_KEY_X",
        "y":"YOUR_PUBLIC_KEY_Y",
        "crv":"P-256"
      }
    }
  3. Crea la carga útil de DPoP:

    La carga útil debe incluir jti (un identificador único para la solicitud), htm (método HTTP, p.ej., POST), htu (URI HTTP, p.ej., https://oauth2.googleapis.com/token) y iat (hora de emisión). Si recibiste un nonce del servidor en un encabezado DPoP-Nonce en la respuesta a una solicitud anterior, debes incluir ese valor de nonce en una reclamación nonce. La reclamación nonce es opcional para los intercambios de código de autorización y solo se usa cuando se recibió previamente el encabezado DPoP-Nonce. Codifica este JSON en Base64Url:

    {
      "jti":"JTI_VALUE",
      "htm":"POST",
      "htu":"https://oauth2.googleapis.com/token",
      "iat":YOUR_JWT_ISSUED_TIME,
      "nonce":"SERVER_PROVIDED_NONCE"
    }

    El valor de jti depende del tipo de intercambio:

    • Para los intercambios de códigos de autorización, el jti debe ser el hash SHA256 codificado en Base64Url del código de autorización: "jti":"BASE64URL(SHA256(AUTHORIZATION_CODE))".
    • Para los intercambios de tokens de actualización, el jti debe ser un identificador único por solicitud: "jti":"YOUR_UNIQUE_PER_REQUEST_IDENTIFIER".
  4. Firma la prueba:

    Concatena el encabezado y la carga útil codificados con un punto (.) y, luego, firma el resultado con tu clave privada usando ES256. Ten en cuenta que JWS requiere que la firma esté en un formato sin procesar concatenado R | S (64 bytes para P-256). Si usas OpenSSL directamente, debes convertir la firma predeterminada codificada en DER ASN.1 a este formato sin procesar.

Un intercambio exitoso se indica con una respuesta 200 OK que contiene los tokens. Si se usa una prueba de DPoP válida durante el intercambio, el token de actualización que devuelve Google estará vinculado a tu clave con DPoP, pero los tokens de acceso no estarán vinculados con DPoP. Los tokens de acceso conservarán el token_type de Bearer en lugar de DPoP. Además, Google devuelve un encabezado HTTP DPoP-Nonce en la respuesta. Tu cliente debe almacenar en caché este nonce y, luego, incluirlo en la reclamación nonce de la prueba de DPoP en las solicitudes posteriores (como cuando se intercambia un token de actualización por un token de acceso nuevo o cuando se llaman a las APIs protegidas por DPoP). Si usas este nonce emitido con anticipación, puedes evitar una falla adicional de ida y vuelta (use_dpop_nonce) en tu próxima solicitud.

Se deben incluir pruebas de DPoP para las solicitudes de intercambio de tokens que se realicen con tokens de actualización vinculados a DPoP.

Se produce un intercambio fallido si falta el encabezado DPoP cuando se espera, no es válido o si la prueba usa una clave diferente de la vinculada al token. En estos casos, el servidor devuelve un error 400 Bad Request. Si la prueba de DPoP tiene reclamaciones htm o htu que no coinciden, un iat vencido, un jti reutilizado o una firma no válida, Google devuelve un código de error invalid_dpop_proof. Si se requiere un nonce de DPoP, como durante un intercambio de tokens de actualización, y a la prueba de DPoP le falta una reclamación de nonce, o el valor del nonce no es aceptable para el servidor (p.ej., venció, ya se usó o es incorrecto), Google devuelve un código de error use_dpop_nonce junto con un encabezado HTTP DPoP-Nonce que contiene un nonce nuevo que puedes usar en una solicitud posterior. Otras fallas podrían mostrar invalid_grant.

Google responde a esta solicitud con un objeto JSON que contiene un token de acceso de corta duración y un token de actualización.

La respuesta contiene los siguientes campos:

Campos
access_token Es el token que envía tu aplicación para autorizar una solicitud a la API de Google.
expires_in La vida útil restante del token de acceso en segundos.
id_token Nota: Esta propiedad solo se devuelve si tu solicitud incluyó un permiso de identidad, como openid, profile o email. El valor es un token web JSON (JWT) que contiene información de identidad firmada digitalmente sobre el usuario.
refresh_token Es un token que puedes usar para obtener un token de acceso nuevo. Los tokens de actualización son válidos hasta que el usuario revoca el acceso o el token de actualización vence. Si se usó DPoP, el token de actualización se vincula a la clave privada que se usó para firmar la prueba de DPoP. Ten en cuenta que siempre se devuelven tokens de actualización para las aplicaciones instaladas.
refresh_token_expires_in Es la vida útil restante del token de actualización en segundos. Este valor solo se establece cuando el usuario otorga acceso basado en el tiempo.
scope Son los permisos de acceso que otorga el access_token expresados como una lista de cadenas delimitadas por espacios que distinguen mayúsculas de minúsculas.
token_type Es el tipo de token que se devuelve. Este valor siempre es Bearer, incluso cuando se usa DPoP.

En el siguiente fragmento, se muestran ejemplos de encabezados de respuesta y cuerpo de respuesta correctos cuando se usa DPoP:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DPoP-Nonce: AN3XwJjZsjnb0ZuWkRlek8QU7wY-Zhf-5IP6tO0tORz0KgtDT1Bo8FX-w4nz3r5lnepI

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

Paso 6: Verifica qué permisos otorgaron los usuarios

Cuando solicites múltiples permisos (alcances), es posible que los usuarios no otorguen acceso a tu app a todos ellos. Tu app debe verificar qué permisos se otorgaron realmente y controlar de forma correcta las situaciones en las que se deniegan algunos permisos, por lo general, inhabilitando las funciones que dependen de esos permisos denegados.

Sin embargo, hay algunas excepciones. Las apps de Google Workspace Enterprise con delegación de autoridad en todo el dominio o las apps marcadas como De confianza omiten la pantalla de consentimiento de permisos detallados. En estas apps, los usuarios no verán la pantalla de consentimiento de permisos detallados. En cambio, tu app recibirá todos los permisos solicitados o ninguno.

Para obtener información más detallada, consulta Cómo controlar los permisos detallados.

Para verificar si el usuario otorgó acceso a tu aplicación a un permiso en particular, examina el campo scope en la respuesta del token de acceso. Son los permisos de acceso que otorga el token de acceso, expresados como una lista de cadenas delimitadas por espacios que distinguen mayúsculas de minúsculas.

Por ejemplo, la siguiente respuesta de token de acceso de ejemplo indica que el usuario otorgó permiso a tu aplicación para ver, editar y borrar de forma permanente los videos de YouTube, las calificaciones, los comentarios y los subtítulos del usuario:

  {
    "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
    "expires_in": 3920,
    "token_type": "Bearer",
    "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
    "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
  }

Llama a las API de Google

Después de que tu aplicación obtenga un token de acceso, puedes usarlo para realizar llamadas a una API de Google en nombre de una cuenta de usuario determinada si se otorgaron los permisos de acceso que requiere la API. Para ello, incluye el token de acceso en una solicitud a la API con un parámetro de consulta access_token o un valor de encabezado HTTP Authorization Bearer. Cuando sea posible, es preferible el encabezado HTTP, ya que las cadenas de consulta suelen ser visibles en los registros del servidor. En la mayoría de los casos, puedes usar una biblioteca cliente para configurar tus llamadas a las APIs de Google (por ejemplo, cuando llamas a la API de YouTube Data).

Ten en cuenta que la API de YouTube Data solo admite cuentas de servicio para los propietarios de contenido de YouTube que poseen y administran varios canales de YouTube, como sellos discográficos y estudios cinematográficos.

Puedes probar todas las APIs de Google y ver sus permisos en OAuth 2.0 Playground.

Ejemplos de HTTP GET

Una llamada al extremo youtube.channels (la API de YouTube Data) con el encabezado HTTP Authorization: Bearer podría verse de la siguiente manera. Ten en cuenta que debes especificar tu propio token de acceso:

GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Aquí se muestra una llamada a la misma API para el usuario autenticado con el parámetro de cadena de consulta access_token:

GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

Ejemplos de curl

Puedes probar estos comandos con la aplicación de línea de comandos de curl. A continuación, se muestra un ejemplo en el que se usa la opción de encabezado HTTP (preferida):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true

O, como alternativa, la opción de parámetro de cadena de consulta:

curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

Cómo actualizar un token de acceso

Los tokens de acceso vencen periódicamente y se convierten en credenciales no válidas para una solicitud a la API relacionada. Puedes actualizar un token de acceso sin solicitarle permiso al usuario (incluso cuando no está presente) si solicitaste acceso sin conexión a los permisos asociados con el token.

Para actualizar un token de acceso, tu aplicación envía una solicitud HTTPS POST al servidor de autorización de Google (https://oauth2.googleapis.com/token) que incluye los siguientes parámetros en el cuerpo de la solicitud:

Nombre Valor
client_id Es el ID de cliente que se obtiene de la Consola de APIs.
client_secret Opcional

Es el secreto del cliente que se obtiene de la Consola de APIs. (El client_secret no corresponde a las solicitudes de clientes registrados como aplicaciones para Android, iOS o Chrome).

grant_type Como se define en la especificación de OAuth 2.0, el valor de este campo debe establecerse en refresh_token.
refresh_token Es el token de actualización que se devuelve del intercambio de códigos de autorización.

Si bien el uso de DPoP es opcional, se recomienda para aumentar la seguridad. Para usar DPoP con un token de actualización, tu aplicación debe generar un JWT de prueba de DPoP nuevo y único para cada solicitud al extremo del token. Esta prueba debe estar firmada con la misma clave privada que se usó durante el intercambio inicial del código de autorización. Tu aplicación agrega la prueba como un encabezado de la solicitud HTTP.

Encabezado Obligatorio Descripción
DPoP Opcional Una prueba de DPoP es un JWT que demuestra la posesión de una clave privada. Este es un encabezado, no un parámetro. Si se proporciona, los tokens devueltos se vinculan a esta clave. Se debe generar una prueba nueva y única para cada solicitud, y debe incluir las reclamaciones htm (método HTTP) y htu (URI HTTP) que coincidan con la solicitud.

En el siguiente fragmento, se muestra una solicitud de ejemplo:

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

client_id=your_client_id&
refresh_token=refresh_token&
grant_type=refresh_token

Para usar DPoP con un token de actualización, debes generar un JWT de prueba de DPoP nuevo y único para la solicitud. Consulta Crea una prueba de DPoP para obtener instrucciones paso a paso sobre cómo generar el par de claves y crear el JWT.

Un intercambio exitoso se indica con una respuesta 200 OK que contiene un token de acceso nuevo. Cuando se usa DPoP, el token_type es Bearer. Una respuesta correcta confirma que se aceptó la prueba de DPoP para el token de actualización. Google también puede devolver un nuevo encabezado HTTP DPoP-Nonce en la respuesta. Si se devuelve, tu cliente debe almacenar en caché este nonce y, luego, incluirlo en la reclamación nonce de la prueba de DPoP en las solicitudes posteriores.

Se produce un intercambio fallido si falta el encabezado DPoP, no es válido o usa una clave incorrecta. Para obtener detalles sobre códigos de error específicos de DPoP y el manejo de nonces, consulta Intercambio fallido.

En el siguiente fragmento, se muestran ejemplos de encabezados de respuesta y cuerpo de respuesta correctos cuando se usa DPoP:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DPoP-Nonce: AN3XwJjZsjnb0ZuWkRlek8QU7wY-Zhf-5IP6tO0tORz0KgtDT1Bo8FX-w4nz3r5lnepI

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

Ten en cuenta que hay límites en la cantidad de tokens de actualización que se emitirán: un límite por combinación de cliente y usuario, y otro por usuario en todos los clientes. Debes guardar los tokens de actualización en un almacenamiento a largo plazo y seguir usándolos mientras sigan siendo válidos. 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.

Revocación de tokens

En algunos casos, es posible que un usuario quiera revocar el acceso otorgado a una aplicación. Un usuario puede revocar el acceso visitando la configuración de la cuenta. Consulta la sección Quita el acceso de un sitio o una app de terceros con acceso a tu cuenta del documento de asistencia para obtener más información.

También es posible que una aplicación revoque de forma programática el acceso que se le otorgó. La revocación programática es importante en los casos en que un usuario cancela la suscripción, quita una aplicación o los recursos de la API que requiere una app cambiaron de forma significativa. En otras palabras, parte del proceso de eliminación puede incluir una solicitud a la API para garantizar que se quiten los permisos otorgados anteriormente a la aplicación.

Para revocar un token de manera programática, tu aplicación realiza una solicitud a https://oauth2.googleapis.com/revoke y, luego, incluye el token como un parámetro:

curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
        https://oauth2.googleapis.com/revoke?token={token}

El token puede ser un token de acceso o un token de actualización. Si el token es un token de acceso y tiene un token de actualización correspondiente, este también se revocará.

Si la revocación se procesa correctamente, el código de estado HTTP de la respuesta es 200. En caso de condiciones de error, se devuelve un código de estado HTTP 400 junto con un código de error.

Métodos de redireccionamiento de apps

Esquema de URI personalizado

Los esquemas de URI personalizados son una forma de vinculación directa que usa un esquema definido de forma personalizada para abrir tu app.

Alternativa al uso de esquemas de URI personalizados en apps de Chrome

Usa la API de Chrome Identity, que entrega la respuesta de OAuth 2.0 directamente a tu app, lo que elimina la necesidad de un URI de redireccionamiento.

Dirección IP de bucle invertido (macOS, Linux, Windows para computadoras de escritorio)

Para recibir el código de autorización con esta URL, tu aplicación debe escuchar en el servidor web local. Esto es posible en muchas plataformas, pero no en todas. Sin embargo, si tu plataforma lo admite, este es el mecanismo recomendado para obtener el código de autorización.

Cuando tu app recibe la respuesta de autorización, para mejorar la usabilidad, debe responder mostrando una página HTML que le indique al usuario que cierre el navegador y regrese a tu app.

Uso recomendado Apps para computadoras con macOS, Linux y Windows
Valores del formulario Establece el tipo de aplicación en App para computadoras.

Copiar y pegar de forma manual (obsoleto)

Protege tus apps

Cómo verificar la propiedad de la app para Chrome

Puedes verificar la propiedad de tu aplicación para reducir el riesgo de suplantación de identidad.

Para completar el proceso de verificación, debes usar tu cuenta de desarrollador de Chrome Web Store. Para que la verificación se realice correctamente, se deben cumplir los siguientes requisitos:

  • Debes tener un artículo registrado en el Panel del desarrollador de Chrome Web Store con el mismo ID de artículo que el cliente de OAuth de la extensión de Chrome para el que estás completando la verificación.
  • Debes ser publicador del elemento de Chrome Web Store. Obtén más información sobre la administración de accesos en el Panel del desarrollador de Chrome Web Store.

En la sección Verifica la propiedad de la app del cliente de la extensión de Chrome, haz clic en el botón Verificar propiedad para completar el proceso de verificación.

Nota: Espera unos minutos antes de completar el proceso de verificación después de otorgar acceso a tu cuenta.

Si la verificación se realiza correctamente, se mostrará una notificación para confirmar el éxito del proceso de verificación. De lo contrario, se mostrará un mensaje de error.

Para corregir una verificación fallida, prueba lo siguiente:

  • Asegúrate de que haya un elemento registrado en el Panel del desarrollador de Chrome Web Store con el mismo ID de artículo que el cliente de OAuth de la extensión de Chrome para el que estás completando la verificación.
  • Asegúrate de ser publicador de la app, es decir, debes ser el publicador individual de la app o miembro del publicador del grupo de la app. Obtén más información sobre la administración de acceso en el Panel del desarrollador de Chrome Web Store.
  • Si acabas de actualizar tu lista de publicadores de grupo, verifica que la lista de membresía de publicadores de grupo esté sincronizada en el Panel del desarrollador de Chrome Web Store. Obtén más información para sincronizar tu lista de membresías de publicador.

Acceso basado en el tiempo

El acceso basado en el tiempo permite que un usuario otorgue a tu app acceso a sus datos durante un período limitado para completar una acción. El acceso basado en el tiempo está disponible en algunos productos de Google durante el flujo de consentimiento, lo que les permite a los usuarios otorgar acceso por un período limitado. Un ejemplo es la API de Data Portability, que permite una transferencia de datos única.

Cuando un usuario otorga a tu aplicación acceso basado en el tiempo, el token de actualización vencerá después de la duración especificada. Ten en cuenta que los tokens de actualización pueden invalidarse antes en circunstancias específicas. Consulta estos casos para obtener más detalles. El campo refresh_token_expires_in que se devuelve en la respuesta del intercambio de código de autorización representa el tiempo restante hasta que venza el token de actualización en esos casos.

Lecturas adicionales

La práctica recomendada actual de IETF OAuth 2.0 para aplicaciones nativas establece muchas de las prácticas recomendadas que se documentan aquí.

Implementa la Protección integral de la cuenta

Un paso adicional que debes seguir para proteger las cuentas de tus usuarios es implementar la Protección integral de la cuenta con el servicio de Protección integral de la cuenta de Google. Este servicio te permite suscribirte a las notificaciones de eventos de seguridad que proporcionan información a tu aplicación sobre cambios importantes en la cuenta del usuario. Luego, puedes usar la información para tomar medidas según cómo decidas responder a los eventos.

Estos son algunos ejemplos de los tipos de eventos que el Servicio de protección integral de la cuenta de Google envía a tu app:

  • 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

Consulta la página Protege las cuentas de usuario con la Protección integral de la cuenta para obtener más información sobre cómo implementar la Protección integral de la cuenta y ver la lista completa de eventos disponibles.