En este documento, se explica cómo implementar la autorización OAuth 2.0 para acceder a la API de datos de YouTube mediante aplicaciones que se ejecutan en dispositivos como TVs, impresoras y consolas de juegos. Más concretamente, este flujo está diseñado para dispositivos que no tienen acceso a un navegador o que tienen capacidades de entrada limitadas.
OAuth 2.0 permite a los usuarios compartir datos específicos con una aplicación y, al mismo tiempo, mantener la privacidad de sus nombres de usuario, contraseñas y demás información. Por ejemplo, una aplicación para TV puede usar OAuth 2.0 a fin de obtener permiso para seleccionar un archivo almacenado en Google Drive.
Como las aplicaciones que usan este flujo se distribuyen a dispositivos individuales, se supone que no pueden guardar secretos. Pueden acceder a las APIs de Google mientras el usuario está presente en la app o cuando esta se ejecuta en segundo plano.
Alternativas
Si estás escribiendo una app para una plataforma como Android, iOS, macOS, Linux o Windows (incluida la plataforma universal de Windows), que tiene acceso al navegador y capacidades de entrada completas, usa el flujo de OAuth 2.0 para aplicaciones móviles y de escritorio. (Debes usar ese flujo incluso si tu app es una herramienta de línea de comandos sin interfaz gráfica).
Si solo deseas que los usuarios accedan con sus Cuentas de Google y usar el token de ID JWT para obtener la información básica del perfil del usuario, consulta Acceso en TVs y dispositivos de entrada limitados.
Requisitos previos
Habilita las API para tu proyecto.
Cualquier aplicación que llame a las APIs de Google debe habilitarlas en la API Console.
Para habilitar una API en tu proyecto, haz lo siguiente:
- Open the API Library en Google API Console.
- If prompted, select a project, or create a new one.
- Usa la página Biblioteca para buscar y habilitar la API de datos de YouTube. Encuentra cualquier otra API que pueda usar tu aplicación y habilítalas.
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 para el servidor 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 con el objetivo de acceder a las APIs que hayas habilitado para ese proyecto.
- Go to the Credentials page.
- Haz clic en Crear credenciales > ID de cliente de OAuth.
- Selecciona el tipo de aplicación TVs and Limited Input devices.
- Asigna un nombre a tu cliente de OAuth 2.0 y haz clic en Crear.
Identifica los permisos de acceso
Los permisos permiten que tu aplicación solo solicite acceso a los recursos que necesita y, al mismo tiempo, permiten a los usuarios controlar la cantidad de acceso que otorgan a tu aplicación. Por lo tanto, puede haber una relación inversa entre la cantidad de alcances 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 de acceso de tu app.
La API de datos de YouTube v3 utiliza los siguientes alcances:
Permisos | |
---|---|
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 | Permite ver información privada de tu canal de YouTube que sea relevante durante el proceso de auditoría con un socio de YouTube. |
Consulta la lista de Permisos permitidos para las apps o los dispositivos instalados.
Obtén tokens de acceso de OAuth 2.0
Si bien la aplicación se ejecuta en un dispositivo con capacidades de entrada limitadas, los usuarios deben tener acceso independiente a un dispositivo con capacidades de entrada más completas para completar este flujo de autorización. El flujo tiene los siguientes pasos:
- Tu aplicación envía una solicitud al servidor de autorización de Google que identifica los alcances a los que la aplicación solicitará permiso para acceder.
- El servidor responde con varios datos que se usan en pasos posteriores, como un código de dispositivo y de usuario.
- Mostrarás información que el usuario puede ingresar en otro dispositivo para autorizar tu app.
- La aplicación comienza a sondear el servidor de autorización de Google para determinar si el usuario la autorizó.
- El usuario cambia a un dispositivo con capacidades de entrada más completas, inicia un navegador web, navega a la URL que se muestra en el paso 3 e ingresa un código que también aparece en el paso 3. El usuario puede otorgar (o denegar) el acceso a tu aplicación.
- La siguiente respuesta a tu solicitud de sondeo contiene los tokens que tu app necesita para autorizar solicitudes en nombre del usuario. (Si el usuario rechazó el acceso a tu aplicación, la respuesta no contiene tokens).
En la siguiente imagen, se ilustra este proceso:

En las siguientes secciones, se explican estos pasos en detalle. Debido a la variedad de capacidades y entornos de ejecución que pueden tener los dispositivos, en los ejemplos que se muestran en este documento se usa la utilidad de línea de comandos curl
. Estos ejemplos deben ser fáciles de transferir a varios lenguajes y entornos de ejecución.
Paso 1: Solicita códigos de usuario y de dispositivo
En este paso, tu dispositivo envía una solicitud HTTP POST al servidor de autorización de Google, en https://oauth2.googleapis.com/device/code
, que identifica tu aplicación y los permisos de acceso a los que esta desea acceder en nombre del usuario.
Debes recuperar esta URL del Documento de descubrimiento con el valor de metadatos device_authorization_endpoint
. Incluye los siguientes parámetros de solicitud HTTP:
Parámetros | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
Obligatorio
El ID de cliente de tu aplicación. Puedes encontrar este valor en API Console Credentials page. |
||||||||||||||||
scope |
Obligatorio
Una lista delimitada por espacios de los permisos que identifican 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. Consulta la lista Permisos permitidos para las apps o dispositivos instalados. 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, existe una relación inversa entre la cantidad de alcances solicitados y la probabilidad de obtener el consentimiento del usuario. La API de datos de YouTube v3 utiliza los siguientes alcances:
En el documento Alcances de la API de OAuth 2.0, se proporciona una lista completa de los alcances que puedes usar para acceder a las API de Google. |
Ejemplos
En el siguiente fragmento, se muestra una solicitud de ejemplo:
POST /device/code HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded client_id=client_id&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly
En este ejemplo, se muestra un comando curl
para enviar la misma solicitud:
curl -d "client_id=client_id&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly" \ https://oauth2.googleapis.com/device/code
Paso 2: Controla la respuesta del servidor de autorización
El servidor de autorización mostrará una de las siguientes respuestas:
Respuesta correcta
Si la solicitud es válida, la respuesta será un objeto JSON que contiene las siguientes propiedades:
Propiedades | |
---|---|
device_code |
Es un valor que Google asigna de manera única para identificar el dispositivo que ejecuta la app que solicita autorización. El usuario autorizará ese dispositivo desde otro con capacidades de entrada más completas. Por ejemplo, un usuario puede usar una laptop o un teléfono celular para autorizar la ejecución de una app en una TV. En este caso, device_code identifica la TV.
Este código permite que el dispositivo que ejecuta la app determine de forma segura si el usuario otorgó o denegó el acceso. |
expires_in |
La cantidad de tiempo, en segundos, que el device_code y el user_code son válidos. Si, en ese tiempo, el usuario no completa el flujo de autorización y tu dispositivo no sondea para recuperar información sobre la decisión del usuario, es posible que debas reiniciar este proceso desde el paso 1. |
interval |
El tiempo, en segundos, que el dispositivo debe esperar entre solicitudes de sondeo. Por ejemplo, si el valor es 5 , tu dispositivo debe enviar una solicitud de sondeo al servidor de autorización de Google cada cinco segundos. Consulta el paso 3 para obtener más detalles. |
user_code |
Un valor que distingue mayúsculas de minúsculas que identifica para Google los permisos a los que la aplicación solicita acceso. Tu interfaz de usuario le indicará al usuario que ingrese este valor en otro dispositivo con capacidades de entrada más completas. Luego, Google usa el valor para mostrar el conjunto correcto de permisos cuando le solicita al usuario que otorgue acceso a la aplicación. |
verification_url |
Una URL a la que el usuario debe navegar en otro dispositivo para ingresar a user_code y otorgar o denegar el acceso a tu aplicación. También se mostrará este valor en la interfaz de usuario. |
En el siguiente fragmento, se muestra una respuesta de muestra:
{ "device_code": "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8", "user_code": "GQVQ-JKEC", "verification_url": "https://www.google.com/device", "expires_in": 1800, "interval": 5 }
Respuesta de cuota excedida
Si las solicitudes de código de tu dispositivo superaron la cuota asociada con tu ID de cliente, recibirás una respuesta 403 con el siguiente error:
{ "error_code": "rate_limit_exceeded" }
En ese caso, usa una estrategia de retirada para reducir la tasa de solicitudes.
Paso 3: Muestra el código de usuario
Muestra al usuario el verification_url
y el user_code
obtenidos en el paso 2. Ambos valores pueden contener cualquier carácter imprimible del grupo de caracteres US-ASCII. El contenido que le muestras al usuario debe indicarle que navegue a verification_url
en otro dispositivo y que ingrese el user_code
.
Ten en cuenta las siguientes reglas al diseñar tu interfaz de usuario (IU):
user_code
- La
user_code
debe mostrarse en un campo que admita 15 caracteres de tamaño “W”. En otras palabras, si puedes mostrar el códigoWWWWWWWWWWWWWWW
de forma correcta, la IU será válida, y te recomendamos que uses ese valor de string cuando pruebes la forma en que se muestrauser_code
en la IU. user_code
distingue entre mayúsculas y minúsculas, y no se debe modificar de ninguna manera, como cambiar el uso de mayúsculas o insertar otros caracteres de formato.
- La
verification_url
- El espacio en el que muestras
verification_url
debe ser lo suficientemente ancho como para admitir una string de URL de 40 caracteres. - No debes modificar el objeto
verification_url
de ninguna manera, excepto para quitar, de manera opcional, el esquema que se mostrará. Si tienes pensado quitar el esquema (p.ej.,https://
) de la URL por motivos de visualización, asegúrate de que tu app admita las varianteshttp
yhttps
.
- El espacio en el que muestras
Paso 4: Consulta el servidor de autorización de Google
Dado que el usuario usará otro dispositivo para navegar a verification_url
y otorgar (o denegar) el acceso, el dispositivo solicitante no recibirá automáticamente una notificación cuando el usuario responda a la solicitud de acceso. Por ese motivo, el dispositivo solicitante debe sondear el servidor de autorización de Google para determinar cuándo el usuario respondió a la solicitud.
El dispositivo solicitante debe seguir enviando solicitudes de sondeo hasta que reciba una respuesta que indique que el usuario respondió a la solicitud de acceso o hasta que venzan device_code
y user_code
obtenidos en el
paso 2. El interval
que se muestra en el paso 2 especifica la cantidad de tiempo, en segundos, que se debe esperar entre solicitudes.
La URL del extremo que se sondeará es https://oauth2.googleapis.com/token
. La solicitud de sondeo contiene los siguientes parámetros:
Parámetros | |
---|---|
client_id |
El ID de cliente de tu aplicación. Puedes encontrar este valor en API Console Credentials page. |
client_secret |
El secreto del cliente para la client_id proporcionada. Puedes encontrar este valor en API Console
Credentials page. |
device_code |
La device_code que muestra el servidor de autorización en el paso 2 |
grant_type |
Configura este valor en urn:ietf:params:oauth:grant-type:device_code . |
Ejemplos
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 client_id=client_id& client_secret=client_secret& device_code=device_code& grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code
En este ejemplo, se muestra un comando curl
para enviar la misma solicitud:
curl -d "client_id=client_id&client_secret=client_secret& \ device_code=device_code& \ grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Adevice_code" \ -H "Content-Type: application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/token
Paso 5: El usuario responde a la solicitud de acceso
En la siguiente imagen, se muestra una página similar a la que ven los usuarios cuando navegan al verification_url
que mostraste en el paso 3:

Después de ingresar el user_code
y, si aún no accedió a Google, el usuario verá una pantalla de consentimiento como la que se muestra a continuación:

Paso 6: Controla las respuestas a las solicitudes de sondeo
El servidor de autorización de Google responde a cada solicitud de sondeo con una de las siguientes respuestas:
Se permite el acceso
Si el usuario otorgó acceso al dispositivo (hizo clic en Allow
en la pantalla de consentimiento), la respuesta contendrá un token de acceso y un token de actualización. Los tokens permiten que tu dispositivo acceda a las APIs de Google en nombre del usuario. (La propiedad scope
de la respuesta determina a qué APIs puede acceder el dispositivo).
En este caso, la respuesta de la API contiene los siguientes campos:
Campos | |
---|---|
access_token |
Es el token que envía la aplicación para autorizar una solicitud a la API de Google. |
expires_in |
La vida útil restante del token de acceso, expresada en segundos. |
refresh_token |
Un token que puedes usar para obtener un token de acceso nuevo. Los tokens de actualización son válidos hasta que el usuario revoque el acceso. Ten en cuenta que los tokens de actualización siempre se muestran para los dispositivos. |
scope |
Los permisos de acceso que otorga access_token , expresados como una lista de strings separadas por espacios y que distinguen mayúsculas de minúsculas. |
token_type |
El tipo de token que se muestra. En este momento, el valor de este campo siempre se establece en Bearer . |
En el siguiente fragmento, se muestra una respuesta de muestra:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email", "token_type": "Bearer", "refresh_token": "1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Los tokens de acceso tienen una vida útil limitada. Si tu aplicación necesita acceder a una API durante un período prolongado, puede usar el token de actualización para obtener un token de acceso nuevo. Si la aplicación necesita este tipo de acceso, debe almacenar el token de actualización para usarlo más adelante.
Acceso denegado
Si el usuario se niega a otorgar acceso al dispositivo, la respuesta del servidor tendrá un código de estado de respuesta HTTP 403
(Forbidden
). La respuesta contendrá el siguiente error:
{ "error": "access_denied", "error_description": "Forbidden" }
Autorización pendiente
Si el usuario aún no completó el flujo de autorización, el servidor muestra un código de estado de respuesta HTTP 428
(Precondition Required
). La respuesta contiene el siguiente error:
{ "error": "authorization_pending", "error_description": "Precondition Required" }
Sondea con demasiada frecuencia
Si el dispositivo envía solicitudes de sondeo con demasiada frecuencia, el servidor muestra un código de estado de respuesta HTTP 403
(Forbidden
). La respuesta contiene el siguiente error:
{ "error": "slow_down", "error_description": "Forbidden" }
Otros errores
El servidor de autorización también muestra errores si a la solicitud de sondeo le faltan parámetros obligatorios o si tiene un valor de parámetro incorrecto. Por lo general, estas solicitudes tienen un código de estado de respuesta HTTP 400
(Bad Request
) o 401
(Unauthorized
). Entre esos errores, se incluyen los siguientes:
Error | Código de estado HTTP | Descripción |
---|---|---|
admin_policy_enforced |
400 |
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é aplicaciones internas y de terceros acceden a los datos de Google Workspace a fin de obtener más información sobre cómo un administrador puede restringir el acceso a los permisos hasta que se otorgue acceso de manera explícita a tu ID de cliente de OAuth. |
invalid_client |
401 |
No se encontró el cliente de OAuth. Por ejemplo, este error se produce si el valor del parámetro El tipo de cliente de OAuth es incorrecto. Asegúrate de que el tipo de aplicación para el ID de cliente esté configurado como TVs y dispositivos de entrada limitada. |
invalid_grant |
400 |
El valor del parámetro code no es válido, ya se reclamó o no se puede analizar. |
unsupported_grant_type |
400 |
El valor del parámetro grant_type no es válido. |
org_internal |
403 |
El ID de cliente de OAuth en la solicitud es parte de un proyecto que limita el acceso a las Cuentas de Google en una organización de Google Cloud específica. Confirma la configuración del tipo de usuario de tu aplicación de OAuth. |
Llama a las APIs de Google
Después de que la aplicación obtiene 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 mediante la inclusión de un parámetro de consulta access_token
o un valor Bearer
del encabezado HTTP Authorization
. Siempre que sea posible, se prefiere el encabezado HTTP, ya que las cadenas de consulta tienden a 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 llama a la API de datos de YouTube).
Ten en cuenta que la API de datos de YouTube solo admite cuentas de servicio para los propietarios del contenido de YouTube que poseen y administran varios canales de YouTube, como sellos discográficos y estudios cinematográficos.
Puedes probar todas las API de Google y ver sus alcances en OAuth 2.0 Playground.
Ejemplos de HTTP GET
Una llamada al extremo
youtube.channels
(la API de datos de YouTube) 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
Esta es 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
curl
ejemplos
Puedes probar estos comandos con la aplicación de línea de comandos de curl
. En el siguiente ejemplo, se usa la opción de encabezado HTTP (opción preferida):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true
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
Actualización de un token de acceso
Los tokens de acceso vencen periódicamente y se dejan de ser 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, la aplicación envía una solicitud POST
HTTPS al servidor de autorización de Google (https://oauth2.googleapis.com/token
) que incluye los siguientes parámetros:
Campos | |
---|---|
client_id |
El ID de cliente obtenido de API Console. |
client_secret |
El secreto del cliente obtenido de API Console. |
grant_type |
Como
se define en la
especificación de OAuth 2.0,
el valor de este campo se debe establecer en refresh_token . |
refresh_token |
El token de actualización que se muestra en el intercambio de código de autorización. |
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 client_id=your_client_id& client_secret=your_client_secret& refresh_token=refresh_token& grant_type=refresh_token
Siempre que el usuario no haya revocado el acceso otorgado a la aplicación, el servidor de tokens muestra un objeto JSON que contiene un token de acceso nuevo. En el siguiente fragmento, se muestra una respuesta de ejemplo:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "scope": "https://www.googleapis.com/auth/drive.metadata.readonly", "token_type": "Bearer" }
Ten en cuenta que existen límites para la cantidad de tokens de actualización que se emitirán: uno por combinación de cliente y usuario, y otro por usuario para todos los clientes. Debes guardar los tokens de actualización en un almacenamiento a largo plazo y seguir usándolos mientras sean válidos. Si tu aplicación solicita demasiados tokens de actualización, podría alcanzar estos límites, en cuyo caso los tokens de actualización más antiguos dejarán de funcionar.
Revoca un token
En algunos casos, es posible que el usuario desee revocar el acceso otorgado a una aplicación. El usuario puede revocar el acceso a través de la Configuración de la cuenta. Para obtener más información, consulta el documento de asistencia Cómo quitar el acceso a sitios o apps de Sitios y apps de terceros con acceso a tu cuenta.
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 anula la suscripción, quita una aplicación o si los recursos de la API que requiere una app cambiaron de manera 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 envía una solicitud a https://oauth2.googleapis.com/revoke
e incluye el token como 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 de acceso o de actualización. Si se trata de un token de acceso y tiene un token de actualización correspondiente, el token de actualización también se revocará.
Si la revocación se procesa correctamente, el código de estado HTTP de la respuesta es 200
. Para las condiciones de error, se muestra un código de estado HTTP 400
junto con un código de error.
Permisos permitidos
El flujo de OAuth 2.0 para dispositivos solo es compatible con los siguientes ámbitos:
OpenID Connect, Acceso con Google
email
openid
profile
API de Drive
https://www.googleapis.com/auth/drive.appdata
https://www.googleapis.com/auth/drive.file
API de YouTube
https://www.googleapis.com/auth/youtube
https://www.googleapis.com/auth/youtube.readonly