En este documento, se explica cómo las aplicaciones de servidor web usan bibliotecas cliente de la API de Google o extremos de Google OAuth 2.0 para implementar la autorización de OAuth 2.0 a fin de acceder a la API de datos de YouTube.
OAuth 2.0 permite a los usuarios compartir datos específicos con una aplicación y proteger la privacidad de sus nombres de usuario, contraseñas y otra información. Por ejemplo, una aplicación puede usar OAuth 2.0 a fin de obtener permiso para subir videos al canal de YouTube de un usuario.
Este flujo de OAuth 2.0 está destinado específicamente a la autorización de usuarios. Está diseñado para aplicaciones que pueden almacenar información confidencial y mantener el estado. Una aplicación del servidor web debidamente autorizada puede acceder a una API mientras el usuario interactúa con ella o después de que sale de ella.
Las aplicaciones de servidor web con frecuencia también usan
cuentas de servicio para autorizar solicitudes a la API, en especial cuando se llama a las API de Cloud para acceder a datos basados en proyectos en lugar de datos específicos del usuario. Las aplicaciones de servidor web pueden usar cuentas de servicio junto con la autorización del usuario.
Ten en cuenta que la API de datos de YouTube admite el flujo de cuentas de servicio solo para los propietarios de contenido de YouTube que poseen y administran varios canales de YouTube.
En particular, los propietarios de contenido pueden usar cuentas de servicio para llamar a los métodos de la API que admiten el parámetro de solicitud onBehalfOfContentOwner
.
Bibliotecas cliente
En los ejemplos específicos del lenguaje en esta página, se usan bibliotecas cliente de la API de Google para implementar la autorización de OAuth 2.0. A fin de ejecutar las muestras de código, primero debes instalar la biblioteca cliente para tu lenguaje.
Cuando usas una biblioteca cliente de la API de Google para controlar el flujo de OAuth 2.0 de tu aplicación, la biblioteca cliente realiza muchas acciones que, de lo contrario, la aplicación debería manejar por su cuenta. Por ejemplo, determina cuándo la aplicación puede usar o actualizar los tokens de acceso almacenados, así como cuándo la aplicación debe volver a obtener el consentimiento. La biblioteca cliente también genera las URL de redireccionamiento correctas y ayuda a implementar controladores de redireccionamiento que intercambian códigos de autorización por tokens de acceso.
Las bibliotecas cliente de la API de Google para aplicaciones del servidor están disponibles en los siguientes lenguajes:
Requisitos previos
Habilita las API para tu proyecto.
Cualquier aplicación que llame a las APIs de Google debe habilitarlas en API Console.
Si quieres habilitar una API para tu proyecto, sigue estos pasos:
- 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 otras API que usará tu aplicación y habilítalas también.
Crea credenciales de autorización
Cualquier aplicación que use OAuth 2.0 para acceder a las API de Google debe tener credenciales de autorización que identifiquen la aplicación en el servidor OAuth 2.0 de Google. En los siguientes pasos, se explica cómo crear credenciales para tu proyecto. Tus aplicaciones pueden usar las credenciales con el fin de acceder a las APIs que habilitaste para ese proyecto.
- Go to the Credentials page.
- Haz clic en Crear credenciales > ID de cliente de OAuth.
- Selecciona el tipo de aplicación Aplicación web.
- Complete el formulario y haga clic en Crear. Las aplicaciones que usan lenguajes y frameworks como PHP, Java, Python, Ruby y .NET deben especificar URI de redireccionamiento autorizados. Los URI de redireccionamiento son los extremos a los que el servidor de OAuth 2.0 puede enviar respuestas. Estos extremos deben cumplir con las reglas de validación de Google.
Para realizar pruebas, puedes especificar los URI que hagan referencia a la máquina local, como
http://localhost:8080
. Con esto en mente, ten en cuenta que todos los ejemplos de este documento usanhttp://localhost:8080
como el URI de redireccionamiento.Te recomendamos que diseñes los extremos de autenticación de tu app para que tu aplicación no exponga códigos de autorización a otros recursos de la página.
Después de crear tus credenciales, descarga el archivo client_secret.json desde API Console. Almacena el archivo de forma segura en una ubicación a la que solo pueda acceder tu aplicación.
Identifica permisos de acceso
Los alcances permiten que la aplicación solo solicite acceso a los recursos que necesita, a la vez que permiten que los usuarios controlen la cantidad de acceso que otorgan a la aplicación. Por lo tanto, es posible que exista 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 para los que tu app necesitará permiso de acceso.
También recomendamos que la aplicación solicite acceso a los permisos de autorización mediante un proceso de autorización incremental, en el que la aplicación solicita acceso a los datos del usuario en contexto. Esta práctica recomendada ayuda a los usuarios a comprender con mayor facilidad por qué tu aplicación necesita el acceso que solicita.
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. |
El documento Permisos de la API de OAuth 2.0 contiene una lista completa de los alcances que puedes usar para acceder a las API de Google.
Requisitos de idioma
Para ejecutar cualquiera de las muestras de código de este documento, necesitarás una Cuenta de Google, acceso a Internet y un navegador web. Si usas una de las bibliotecas cliente de la API, también puedes consultar los requisitos específicos de cada lenguaje a continuación.
PHP
Para ejecutar las muestras de código PHP de este documento, necesitarás lo siguiente:
- PHP 5.6 o superior con la interfaz de línea de comandos (CLI) y la extensión JSON instalada.
- La herramienta de administración de dependencias de Composer
-
La biblioteca cliente de las API de Google para PHP:
composer require google/apiclient:^2.10
Python
Para ejecutar las muestras de código de Python en este documento, necesitarás lo siguiente:
- Python 2.6 o superior
- La herramienta de administración de paquetes pip.
- Biblioteca cliente de las API de Google para Python:
pip install --upgrade google-api-python-client
google-auth
,google-auth-oauthlib
ygoogle-auth-httplib2
para la autorización del usuariopip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
- El framework de la aplicación web de Flask en Python.
pip install --upgrade flask
- La biblioteca HTTP
requests
.pip install --upgrade requests
Ruby
Para ejecutar las muestras de código de Ruby en este documento, necesitarás lo siguiente:
- Ruby 2.2.2 o una versión más reciente
-
La biblioteca cliente de las API de Google para Ruby:
gem install google-api-client
-
El framework de la aplicación web de Sinatra Ruby.
gem install sinatra
Node.js
Para ejecutar las muestras de código de Node.js en este documento, necesitarás lo siguiente:
- La LTS de mantenimiento, la LTS activa o la versión actual de Node.js.
-
El cliente Node.js de las API de Google:
npm install googleapis
HTTP/REST
No es necesario instalar ninguna biblioteca para llamar directamente a los extremos de OAuth 2.0.
Obtén tokens de acceso de OAuth 2.0
En los siguientes pasos, se muestra cómo tu aplicación interactúa con el servidor de OAuth 2.0 de Google a fin de obtener el consentimiento de un usuario para realizar una solicitud a la API en su nombre. La aplicación debe tener ese consentimiento para poder ejecutar una solicitud a la API de Google que requiera la autorización del usuario.
En la siguiente lista, se resumen rápidamente estos pasos:
- Tu aplicación identifica los permisos que necesita.
- Tu aplicación redirecciona al usuario a Google, junto con la lista de permisos solicitados.
- El usuario decide si otorgará los permisos a su aplicación.
- Tu aplicación descubre lo que el usuario decidió.
- Si el usuario otorgó los permisos solicitados, tu aplicación recupera los tokens necesarios para realizar solicitudes a la API en su nombre.
Paso 1: Configure los parámetros de autorización
El primer paso es crear la solicitud de autorización. Esa solicitud establece parámetros que identifican tu aplicación y definen los permisos que el usuario deberá otorgar a tu aplicación.
- Si usas una biblioteca cliente de Google para la autenticación y autorización de OAuth 2.0, debes crear y configurar un objeto que defina estos parámetros.
- Si llamas directamente al extremo de Google OAuth 2.0, generarás una URL y configurarás los parámetros en ella.
Las pestañas a continuación definen los parámetros de autorización admitidos para las aplicaciones de servidor web. En los ejemplos específicos del lenguaje, también se muestra cómo usar una biblioteca cliente o una biblioteca de autorización para configurar un objeto que establezca esos parámetros.
PHP
El siguiente fragmento de código crea un objeto Google\Client()
, que define los parámetros en la solicitud de autorización.
Ese objeto usa información de tu archivo client_secret.json para identificar tu aplicación. (Consulta Crea credenciales de autorización para obtener más información sobre ese archivo). El objeto también identifica los permisos a los que tu aplicación solicita permiso de acceso y la URL al extremo de autenticación de tu aplicación, que manejará la respuesta del servidor OAuth 2.0 de Google. Por último, el código establece los parámetros opcionales access_type
y include_granted_scopes
.
Por ejemplo, este código solicita acceso sin conexión para administrar la cuenta de YouTube de un usuario:
$client = new Google\Client(); $client->setAuthConfig('client_secret.json'); $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); // offline access will give you both an access and refresh token so that // your app can refresh the access token without user interaction. $client->setAccessType('offline'); // Using "consent" ensures that your application always receives a refresh token. // If you are not using offline access, you can omit this. $client->setApprovalPrompt('consent'); $client->setIncludeGrantedScopes(true); // incremental auth
La solicitud especifica la siguiente información:
Parámetros | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
Obligatorio
El ID de cliente para tu aplicación. Puedes encontrar este valor en el Credentials pagede API Console. En PHP, llama a la función $client = new Google\Client(); $client->setAuthConfig('client_secret.json'); |
||||||||||||||||
redirect_uri |
Obligatorio
Determina dónde el servidor de API redirecciona al usuario después de que completa el flujo de autorización. El valor debe coincidir exactamente con uno de los URI de redireccionamiento autorizados para el cliente de OAuth 2.0, que configuraste en el Credentials pagede tu cliente API Console. Si este valor no coincide con un URI de redireccionamiento autorizado para la Ten en cuenta que el esquema de Para establecer este valor en PHP, llama a la función $client->setRedirectUri('https://oauth2.example.com/code'); |
||||||||||||||||
scope |
Obligatorio
Una lista delimitada por espacios de los permisos que identifican los recursos a los que la 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, a la vez que les permite a los usuarios controlar el nivel 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. Para establecer este valor en PHP, llama a la función $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); La API de datos de YouTube v3 utiliza los siguientes alcances:
En el documento Permisos 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. Recomendamos que la aplicación solicite acceso a los permisos de autorización siempre que sea posible. Cuando solicitas acceso a los datos del usuario en contexto, mediante autorización incremental, ayudas a los usuarios a comprender con mayor facilidad por qué tu aplicación necesita el acceso que solicita. |
||||||||||||||||
access_type |
Se recomienda
Indica si tu aplicación puede actualizar los tokens de acceso cuando el usuario no está presente en el navegador. Los valores de parámetros válidos son Establece el valor en Para establecer este valor en PHP, llama a la función $client->setAccessType('offline'); |
||||||||||||||||
state |
Se recomienda
Especifica cualquier valor de string que use tu aplicación para mantener el estado entre tu solicitud de autorización y la respuesta del servidor de autorización.
El servidor muestra el valor exacto que envías como un par 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 Para establecer este valor en PHP, llama a la función $client->setState($sample_passthrough_value); |
||||||||||||||||
include_granted_scopes |
Optional
Permite que las aplicaciones usen la autorización incremental para solicitar acceso a permisos adicionales en contexto. Si estableces el valor de este parámetro en Para establecer este valor en PHP, llama a la función $client->setIncludeGrantedScopes(true); |
||||||||||||||||
login_hint |
Optional
Si tu aplicación sabe qué usuario está intentando autenticar, 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 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 Para establecer este valor en PHP, llama a la función $client->setLoginHint('None'); |
||||||||||||||||
prompt |
Optional
Una lista de mensajes delimitados por espacios que distinguen entre mayúsculas y minúsculas para presentar al usuario Si no especificas este parámetro, se le solicitará al usuario solo la primera vez que su proyecto solicite acceso. Para obtener más información, consulta Cómo solicitar el consentimiento. Para establecer este valor en PHP, llama a la función $client->setApprovalPrompt('consent'); Los valores posibles son:
|
Python
En el siguiente fragmento de código, se usa el módulo google-auth-oauthlib.flow
para construir la solicitud de autorización.
El código construye un objeto Flow
, que identifica tu aplicación con información del archivo client_secret.json que descargaste después de crear credenciales de autorización. Ese objeto también identifica los
alcances a los que la aplicación solicita permiso para acceder y la URL al extremo de autenticación
de la aplicación, que controlará la respuesta del servidor OAuth 2.0 de Google. Por último, el código establece los parámetros opcionales access_type
y include_granted_scopes
.
Por ejemplo, este código solicita acceso sin conexión para administrar la cuenta de YouTube de un usuario:
import google.oauth2.credentials import google_auth_oauthlib.flow # Use the client_secret.json file to identify the application requesting # authorization. The client ID (from that file) and access scopes are required. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/youtube.force-ssl']) # Indicate where the API server will redirect the user after the user completes # the authorization flow. The redirect URI is required. The value must exactly # match one of the authorized redirect URIs for the OAuth 2.0 client, which you # configured in the API Console. If this value doesn't match an authorized URI, # you will get a 'redirect_uri_mismatch' error. flow.redirect_uri = 'https://www.example.com/oauth2callback' # Generate URL for request to Google's OAuth 2.0 server. # Use kwargs to set optional request parameters. authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
La solicitud especifica la siguiente información:
Parámetros | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
Obligatorio
El ID de cliente para tu aplicación. Puedes encontrar este valor en el Credentials pagede API Console. En Python, llama al método flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/youtube.force-ssl']) |
||||||||||||||||
redirect_uri |
Obligatorio
Determina dónde el servidor de API redirecciona al usuario después de que completa el flujo de autorización. El valor debe coincidir exactamente con uno de los URI de redireccionamiento autorizados para el cliente de OAuth 2.0, que configuraste en el Credentials pagede tu cliente API Console. Si este valor no coincide con un URI de redireccionamiento autorizado para la Ten en cuenta que el esquema de Para establecer este valor en Python, configura la propiedad flow.redirect_uri = 'https://oauth2.example.com/code' |
||||||||||||||||
scope |
Obligatorio
Una lista de permisos que identifican los recursos a los que la 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, a la vez que les permite a los usuarios controlar el nivel 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. En Python, usa el mismo método de configuración de flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/youtube.force-ssl']) La API de datos de YouTube v3 utiliza los siguientes alcances:
En el documento Permisos 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. Recomendamos que la aplicación solicite acceso a los permisos de autorización siempre que sea posible. Cuando solicitas acceso a los datos del usuario en contexto, mediante autorización incremental, ayudas a los usuarios a comprender con mayor facilidad por qué tu aplicación necesita el acceso que solicita. |
||||||||||||||||
access_type |
Se recomienda
Indica si tu aplicación puede actualizar los tokens de acceso cuando el usuario no está presente en el navegador. Los valores de parámetros válidos son Establece el valor en En Python, configura el parámetro authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||||||||||||
state |
Se recomienda
Especifica cualquier valor de string que use tu aplicación para mantener el estado entre tu solicitud de autorización y la respuesta del servidor de autorización.
El servidor muestra el valor exacto que envías como un par 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 En Python, configura authorization_url, state = flow.authorization_url( access_type='offline', state=sample_passthrough_value, include_granted_scopes='true') |
||||||||||||||||
include_granted_scopes |
Optional
Permite que las aplicaciones usen la autorización incremental para solicitar acceso a permisos adicionales en contexto. Si estableces el valor de este parámetro en En Python, configura el parámetro authorization_url, state = flow.authorization_url( access_type='offline', include_granted_scopes='true') |
||||||||||||||||
login_hint |
Optional
Si tu aplicación sabe qué usuario está intentando autenticar, 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 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 En Python, configura el parámetro authorization_url, state = flow.authorization_url( access_type='offline', login_hint='None', include_granted_scopes='true') |
||||||||||||||||
prompt |
Optional
Una lista de mensajes delimitados por espacios que distinguen entre mayúsculas y minúsculas para presentar al usuario Si no especificas este parámetro, se le solicitará al usuario solo la primera vez que su proyecto solicite acceso. Para obtener más información, consulta Cómo solicitar el consentimiento. En Python, configura authorization_url, state = flow.authorization_url( access_type='offline', prompt='consent', include_granted_scopes='true') Los valores posibles son:
|
Ruby
Usa el archivo client_secrets.json que creaste para configurar un objeto de cliente en tu aplicación. Cuando configuras un objeto de cliente, especificas los alcances a los que necesita acceder la aplicación, junto con la URL del extremo de autenticación de la aplicación, que manejará la respuesta del servidor de OAuth 2.0.
Por ejemplo, este código solicita acceso sin conexión para administrar la cuenta de YouTube de un usuario:
require 'google/apis/youtube_v3' require 'google/api_client/client_secrets' client_secrets = Google::APIClient::ClientSecrets.load auth_client = client_secrets.to_authorization auth_client.update!( :scope => 'https://www.googleapis.com/auth/youtube.force-ssl', :redirect_uri => 'http://www.example.com/oauth2callback', :additional_parameters => { "access_type" => "offline", # offline access "include_granted_scopes" => "true" # incremental auth } )
Tu aplicación usa el objeto de cliente para realizar operaciones de OAuth 2.0, como generar URL de solicitudes de autorización y aplicar tokens de acceso a las solicitudes HTTP.
Node.js
El siguiente fragmento de código crea un objeto google.auth.OAuth2
, que define los parámetros en la solicitud de autorización.
Ese objeto usa información de tu archivo client_secret.json para identificar tu aplicación. Para solicitar permisos a un usuario a fin de recuperar un token de acceso, debe redireccionarlo a una página de consentimiento. Para crear una URL de la página de consentimiento, siga estos pasos:
const {google} = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI * from the client_secret.json file. To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
Nota importante: refresh_token
solo se muestra en la primera autorización. Obtén más detalles
aquí.
HTTP/REST
El extremo de OAuth 2.0 de Google está en https://accounts.google.com/o/oauth2/v2/auth
. Solo se puede acceder a este extremo mediante HTTPS. Se rechazan las conexiones HTTP simples.
El servidor de autorización de Google admite los siguientes parámetros de string de consulta para aplicaciones de servidor web:
Parámetros | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
Obligatorio
El ID de cliente para tu aplicación. Puedes encontrar este valor en el Credentials pagede API Console. |
||||||||||||||||
redirect_uri |
Obligatorio
Determina dónde el servidor de API redirecciona al usuario después de que completa el flujo de autorización. El valor debe coincidir exactamente con uno de los URI de redireccionamiento autorizados para el cliente de OAuth 2.0, que configuraste en el Credentials pagede tu cliente API Console. Si este valor no coincide con un URI de redireccionamiento autorizado para la Ten en cuenta que el esquema de |
||||||||||||||||
response_type |
Obligatorio
Determina si el extremo de Google OAuth 2.0 muestra un código de autorización. Establece el valor del parámetro en |
||||||||||||||||
scope |
Obligatorio
Una lista delimitada por espacios de los permisos que identifican los recursos a los que la 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, a la vez que les permite a los usuarios controlar el nivel 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 Permisos 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. Recomendamos que la aplicación solicite acceso a los permisos de autorización siempre que sea posible. Cuando solicitas acceso a los datos del usuario en contexto, mediante autorización incremental, ayudas a los usuarios a comprender con mayor facilidad por qué tu aplicación necesita el acceso que solicita. |
||||||||||||||||
access_type |
Se recomienda
Indica si tu aplicación puede actualizar los tokens de acceso cuando el usuario no está presente en el navegador. Los valores de parámetros válidos son Establece el valor en |
||||||||||||||||
state |
Se recomienda
Especifica cualquier valor de string que use tu aplicación para mantener el estado entre tu solicitud de autorización y la respuesta del servidor de autorización.
El servidor muestra el valor exacto que envías como un par 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 |
||||||||||||||||
include_granted_scopes |
Optional
Permite que las aplicaciones usen la autorización incremental para solicitar acceso a permisos adicionales en contexto. Si estableces el valor de este parámetro en |
||||||||||||||||
login_hint |
Optional
Si tu aplicación sabe qué usuario está intentando autenticar, 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 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 |
||||||||||||||||
prompt |
Optional
Una lista de mensajes delimitados por espacios que distinguen entre mayúsculas y minúsculas para presentar al usuario Si no especificas este parámetro, se le solicitará al usuario solo la primera vez que su proyecto solicite acceso. Para obtener más información, consulta Cómo solicitar el consentimiento. Los valores posibles son:
|
Paso 2: Redireccionar al servidor OAuth 2.0 de Google
Redirecciona al usuario al servidor OAuth 2.0 de Google para iniciar el proceso de autenticación y autorización. Por lo general, esto ocurre cuando tu aplicación necesita acceder a los datos del usuario por primera vez. En el caso de la autorización incremental, este paso también ocurre cuando tu aplicación necesita acceder a recursos adicionales a los que aún no tiene permiso para acceder.
PHP
- Genera una URL para solicitar acceso desde el servidor OAuth 2.0 de Google:
$auth_url = $client->createAuthUrl();
- Redireccionar al usuario a
$auth_url
:header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
Python
En este ejemplo, se muestra cómo redireccionar al usuario a la URL de autorización con el framework de aplicación web de Flask:
return flask.redirect(authorization_url)
Ruby
- Genera una URL para solicitar acceso desde el servidor OAuth 2.0 de Google:
auth_uri = auth_client.authorization_uri.to_s
- Redireccionar al usuario a
auth_uri
Node.js
-
Usa la URL
authorizationUrl
generada del paso 1 del métodogenerateAuthUrl
para solicitar acceso desde el servidor OAuth 2.0 de Google. -
Redireccionar al usuario a
authorizationUrl
res.writeHead(301, { "Location": authorizationUrl });
HTTP/REST
Sample redirect to Google's authorization server
The sample URL below requests offline access
(access_type=offline
) to a scope that permits access to view
the user's YouTube account. It uses incremental authorization to ensure that
the new access token covers any scopes to which the user previously granted
the application access. The URL also sets values for the required
redirect_uri
, response_type
, and
client_id
parameters as well as for the state
parameter. The URL contains line breaks and spaces for readability.
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
access_type=offline&
include_granted_scopes=true&
state=state_parameter_passthrough_value&
redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
response_type=code&
client_id=client_id
Después de crear la URL de la solicitud, redirecciona al usuario a ella.
El servidor de OAuth 2.0 de Google autentica al usuario y obtiene su consentimiento para que tu aplicación acceda a los permisos solicitados. La respuesta se envía a tu aplicación con la URL de redireccionamiento que especificaste.
Paso 3: Google solicita el consentimiento del usuario
En este paso, el usuario decide si le otorga a la aplicación el acceso solicitado. En esta etapa, Google muestra una ventana de consentimiento que muestra el nombre de tu aplicación y los servicios de las API de Google a los que solicita permiso para acceder con las credenciales de autorización del usuario y un resumen de los permisos de acceso que se otorgarán. Luego, el usuario puede aceptar otorgar acceso a uno o más permisos solicitados por tu aplicación o rechazar la solicitud.
En esta etapa, tu aplicación no necesita realizar ninguna acción mientras espera la respuesta del servidor OAuth 2.0 de Google, lo que indica si se otorgó 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 orientados al usuario en lugar de los flujos de autenticación y autorización esperados. A continuación, se indican los códigos de error comunes y las resoluciones sugeridas.
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 explícitamente 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.
Android
Es posible que los desarrolladores de Android encuentren este mensaje de error cuando abran solicitudes de autorización en android.webkit.WebView
.
En su lugar, los desarrolladores deben usar bibliotecas de Android, como Acceso con Google para Android o AppAuth para Android de OpenID Foundation.
Los desarrolladores web pueden encontrar este error cuando una app para Android 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 se abran vínculos generales en el controlador de vínculos predeterminado del sistema operativo, que incluye controladores de Android App Links o la app de navegador predeterminada. La biblioteca de pestañas personalizadas de Android también es una opción compatible.
iOS
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 se abran vínculos generales en el controlador de vínculos predeterminado del sistema operativo, que incluye controladores de Universal Links 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 de 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 Configuración de la pantalla de consentimiento de OAuth.
invalid_client
El secreto de cliente de OAuth es incorrecto. Revisa la configuración del cliente de OAuth, incluido el ID y el secreto de cliente utilizados en esta solicitud.
invalid_grant
Cuando se actualiza un token de acceso o se usa una autorización incremental, es posible que este haya vencido o se haya invalidado. Vuelve a autenticar al usuario y pídele su consentimiento para obtener tokens nuevos. Si continúas 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 la cuenta de usuario se haya borrado o inhabilitado.
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 URI de redireccionamiento autorizados en Google API Console Credentials page.
El parámetro redirect_uri
puede referirse al flujo de OAuth fuera de banda (OOB) que
dejó de estar disponible y ya no es compatible. Consulta la guía de migración para actualizar tu integración.
Paso 4: Controla la respuesta del servidor de OAuth 2.0
El servidor de OAuth 2.0 responde a la solicitud de acceso de tu aplicación mediante la URL especificada en la solicitud.
Si el usuario aprueba la solicitud de acceso, la respuesta contendrá un código de autorización. Si el usuario no aprueba la solicitud, la respuesta contendrá un mensaje de error. El código de autorización o el mensaje de error que se muestra al servidor web aparece en la cadena de consulta, como se muestra a continuación:
Una respuesta de error:
https://oauth2.example.com/auth?error=access_denied
Una respuesta del código de autorización:
https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
Respuesta del servidor OAuth 2.0 de muestra
Para probar este flujo, haz clic en la siguiente URL de muestra, que solicita acceso de solo lectura a fin de ver los metadatos de los archivos de tu Google Drive:
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly& access_type=offline& include_granted_scopes=true& state=state_parameter_passthrough_value& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=code& client_id=client_id
Después de completar el flujo de OAuth 2.0, se te redireccionará a http://localhost/oauth2callback
, que probablemente generará un error 404 NOT FOUND
, a menos que tu máquina local entregue un archivo en esa dirección. En el siguiente paso, se proporciona más detalles sobre la información que se muestra en el URI cuando se redirecciona al usuario a tu aplicación.
Paso 5: Intercambia el código de autorización para actualizar y acceder a los tokens
Después de que el servidor web recibe el código de autorización, puede intercambiarlo por un token de acceso.
PHP
Para intercambiar un código de autorización por un token de acceso, usa el método authenticate
:
$client->authenticate($_GET['code']);
Puedes recuperar el token de acceso con el método getAccessToken
:
$access_token = $client->getAccessToken();
Python
En la página de devolución de llamada, usa la biblioteca google-auth
para verificar la respuesta del servidor de autorización. Luego, usa el método flow.fetch_token
para intercambiar el código de autorización en esa respuesta por un token de acceso:
state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/youtube.force-ssl'], state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store the credentials in the session. # ACTION ITEM for developers: # Store user's access and refresh tokens in your data store if # incorporating this code into your real app. credentials = flow.credentials flask.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes}
Ruby
Para intercambiar un código de autorización por un token de acceso, usa el método fetch_access_token!
:
auth_client.code = auth_code auth_client.fetch_access_token!
Node.js
Para intercambiar un código de autorización por un token de acceso, usa el método getToken
:
const url = require('url'); // Receive the callback from Google's OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the OAuth 2.0 server response let q = url.parse(req.url, true).query; // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); }
HTTP/REST
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 obtenido del API Console Credentials page. |
client_secret |
El secreto del cliente obtenido de API Console Credentials page. |
code |
El código de autorización que muestra la solicitud inicial |
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 |
Uno de los URI de redireccionamiento enumerados para tu proyecto en el API Console
Credentials page de la client_id determinada. |
En el siguiente fragmento, se muestra una solicitud de muestra:
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
Para responder a esta solicitud, Google muestra un objeto JSON que contiene un token de acceso de corta duración y un token de actualización.
Ten en cuenta que el token de actualización solo se muestra si la aplicación configuró el parámetro access_type
como offline
en la solicitud inicial al servidor de autorización de Google.
La respuesta contiene los siguientes campos:
Campos | |
---|---|
access_token |
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. |
refresh_token |
Un token que puedes usar para obtener un nuevo token de acceso. Los tokens de actualización son válidos hasta que el usuario revoca el acceso.
Una vez más, este campo solo está presente en esta respuesta si configuras el parámetro access_type como offline en la solicitud inicial para el servidor de autorización de Google.
|
scope |
Los permisos de acceso que otorga access_token se expresan como una lista de strings delimitadas 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 está configurado como Bearer . |
En el siguiente fragmento, se muestra una respuesta de muestra:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
Errores
Cuando se intercambia el código de autorización por un token de acceso, es posible que aparezca el siguiente error en lugar de la respuesta esperada. A continuación, se indican los códigos de error comunes y las resoluciones sugeridas.
invalid_grant
El código de autorización proporcionado no es válido o tiene un formato incorrecto. Solicita un código nuevo mediante el reinicio del proceso de OAuth para volver a solicitar el consentimiento del usuario.
Llamar a las API de Google
PHP
Usa el token de acceso para llamar a las API de Google mediante los siguientes pasos:
- Si necesitas aplicar un token de acceso a un objeto
Google\Client
nuevo (por ejemplo, si almacenaste el token de acceso en una sesión de usuario), usa el métodosetAccessToken
:$client->setAccessToken($access_token);
- Compila un objeto de servicio para la API a la que deseas llamar. A fin de compilar un objeto de servicio, proporciona un objeto
Google\Client
autorizado al constructor para la API a la que deseas llamar. Por ejemplo, para llamar a la API de datos de YouTube:$youtube = new Google_Service_YouTube($client);
- Realiza solicitudes al servicio de la API mediante la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado, haz lo siguiente:
$channel = $youtube->channels->listChannels('snippet', array('mine' => $mine));
Python
Después de obtener un token de acceso, la aplicación puede usarlo para autorizar solicitudes a la API en nombre de una cuenta de usuario o de servicio determinada. Usa las credenciales de autorización específicas del usuario a fin de compilar un objeto de servicio para la API a la que deseas llamar y, luego, usa ese objeto a fin de realizar solicitudes autorizadas a la API.
- Compila un objeto de servicio para la API a la que deseas llamar. Para crear un objeto de servicio,
llama al método
build
de la bibliotecagoogleapiclient.discovery
con el nombre y la versión de la API y las credenciales de usuario: Por ejemplo, para llamar a la versión 3 de la API de datos de YouTube:from googleapiclient.discovery import build youtube = build('youtube', 'v3', credentials=credentials)
- Realiza solicitudes al servicio de la API mediante la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado, haz lo siguiente:
channel = youtube.channels().list(mine=True, part='snippet').execute()
Ruby
Usa el objeto auth_client
para llamar a las APIs de Google mediante los siguientes pasos:
- Compila un objeto de servicio para la API a la que deseas llamar.
Por ejemplo, para llamar a la versión 3 de la API de datos de YouTube:
youtube = Google::Apis::YoutubeV3::YouTubeService.new
- Configura las credenciales en el servicio:
youtube.authorization = auth_client
- Realiza solicitudes al servicio de la API mediante la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado, haz lo siguiente:
channel = youtube.list_channels(part, :mine => mine)
Como alternativa, la autorización se puede proporcionar por método proporcionando el parámetro options
a un método:
channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client })
Node.js
Después de obtener un token de acceso y configurarlo en el objeto OAuth2
, úsalo para llamar a las APIs de Google. Tu aplicación puede usar ese token para autorizar solicitudes a la API en nombre de una cuenta de usuario o de servicio determinada. Compila un objeto de servicio para la API a la que deseas llamar.
const { google } = require('googleapis'); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } });
HTTP/REST
Una vez 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 mediante la inclusión de un parámetro de consulta access_token
o un valor Bearer
de encabezado HTTP Authorization
. Cuando es posible, se prefiere el encabezado HTTP, ya que las strings 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 API de Google (por ejemplo, cuando llames 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 de 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 el Playground de OAuth 2.0.
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 string 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
. A continuación, te mostramos un ejemplo en el que 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 string de consulta:
curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
Ejemplo completo
En el siguiente ejemplo, se imprime un objeto con formato JSON que muestra información sobre el canal de YouTube de un usuario después de que este se autentica y autoriza a la aplicación a administrar su cuenta de YouTube.
PHP
Para ejecutar este ejemplo, haz lo siguiente:
- En API Console, agrega la URL de la máquina local a la lista de URLs de redireccionamiento. Por ejemplo, agrega
http://localhost:8080
. - Crea un directorio nuevo y cámbialo. Por ejemplo:
mkdir ~/php-oauth2-example cd ~/php-oauth2-example
- Instala la biblioteca cliente de la API de Google para PHP con Composer:
composer require google/apiclient:^2.10
- Crea los archivos
index.php
yoauth2callback.php
con el siguiente contenido. - Ejecuta el ejemplo con un servidor web configurado para entregar PHP. Si usas PHP 5.6 o una versión más reciente, puedes usar el servidor web de prueba integrado de PHP:
php -S localhost:8080 ~/php-oauth2-example
index.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfig('client_secrets.json'); $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); $youtube = new Google_Service_YouTube($client); $channel = $youtube->channels->listChannels('snippet', array('mine' => $mine)); echo json_encode($channel); } else { $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
oauth2callback.php
<?php require_once __DIR__.'/vendor/autoload.php'; session_start(); $client = new Google\Client(); $client->setAuthConfigFile('client_secrets.json'); $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); $client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL); if (! isset($_GET['code'])) { $auth_url = $client->createAuthUrl(); header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); } else { $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/'; header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); }
Python
En este ejemplo, se usa el framework Flask. Ejecuta una aplicación web en http://localhost:8080
que te permite probar el flujo de OAuth 2.0. Si vas a esa URL, deberías ver cuatro vínculos:
- Prueba una solicitud a la API: Este vínculo apunta a una página que intenta ejecutar una solicitud a la API de muestra. Si es necesario, inicia el flujo de autorización. Si se ejecuta de forma correcta, la página muestra la respuesta de la API.
- Prueba el flujo de autenticación directamente: Este vínculo dirige a una página que intenta enviar al usuario a través del flujo de autorización. La app solicita permiso para enviar solicitudes autorizadas de API en nombre del usuario.
- Revocar credenciales actuales: Este vínculo apunta a una página que revoca los permisos que el usuario ya otorgó a la aplicación.
- Borrar credenciales de sesión de Flask: Este vínculo borra las credenciales de autorización que se almacenan en la sesión de Flask. Esto te permite ver lo que sucedería si un usuario que ya había otorgado permiso a tu app intentara ejecutar una solicitud a la API en una nueva sesión. También te permite ver la respuesta de la API que tu app obtendría si un usuario revocara los permisos que se le otorgaron y tu app intentó autorizar una solicitud con un token de acceso revocado.
# -*- coding: utf-8 -*- import os import flask import requests import google.oauth2.credentials import google_auth_oauthlib.flow import googleapiclient.discovery # This variable specifies the name of a file that contains the OAuth 2.0 # information for this application, including its client_id and client_secret. CLIENT_SECRETS_FILE = "client_secret.json" # This OAuth 2.0 access scope allows for full read/write access to the # authenticated user's account and requires requests to use an SSL connection. SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl'] API_SERVICE_NAME = 'youtube' API_VERSION = 'v3' app = flask.Flask(__name__) # Note: A secret key is included in the sample so that it works. # If you use this code in your application, replace this with a truly secret # key. See https://flask.palletsprojects.com/quickstart/#sessions. app.secret_key = 'REPLACE ME - this value is here as a placeholder.' @app.route('/') def index(): return print_index_table() @app.route('/test') def test_api_request(): if 'credentials' not in flask.session: return flask.redirect('authorize') # Load credentials from the session. credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) youtube = googleapiclient.discovery.build( API_SERVICE_NAME, API_VERSION, credentials=credentials) channel = youtube.channels().list(mine=True, part='snippet').execute() # Save credentials back to session in case access token was refreshed. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. flask.session['credentials'] = credentials_to_dict(credentials) return flask.jsonify(**channel) @app.route('/authorize') def authorize(): # Create flow instance to manage the OAuth 2.0 Authorization Grant Flow steps. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES) # The URI created here must exactly match one of the authorized redirect URIs # for the OAuth 2.0 client, which you configured in the API Console. If this # value doesn't match an authorized URI, you will get a 'redirect_uri_mismatch' # error. flow.redirect_uri = flask.url_for('oauth2callback', _external=True) authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true') # Store the state so the callback can verify the auth server response. flask.session['state'] = state return flask.redirect(authorization_url) @app.route('/oauth2callback') def oauth2callback(): # Specify the state when creating the flow in the callback so that it can # verified in the authorization server response. state = flask.session['state'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) flow.redirect_uri = flask.url_for('oauth2callback', _external=True) # Use the authorization server's response to fetch the OAuth 2.0 tokens. authorization_response = flask.request.url flow.fetch_token(authorization_response=authorization_response) # Store credentials in the session. # ACTION ITEM: In a production app, you likely want to save these # credentials in a persistent database instead. credentials = flow.credentials flask.session['credentials'] = credentials_to_dict(credentials) return flask.redirect(flask.url_for('test_api_request')) @app.route('/revoke') def revoke(): if 'credentials' not in flask.session: return ('You need to <a href="/authorize">authorize</a> before ' + 'testing the code to revoke credentials.') credentials = google.oauth2.credentials.Credentials( **flask.session['credentials']) revoke = requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'}) status_code = getattr(revoke, 'status_code') if status_code == 200: return('Credentials successfully revoked.' + print_index_table()) else: return('An error occurred.' + print_index_table()) @app.route('/clear') def clear_credentials(): if 'credentials' in flask.session: del flask.session['credentials'] return ('Credentials have been cleared.<br><br>' + print_index_table()) def credentials_to_dict(credentials): return {'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes} def print_index_table(): return ('<table>' + '<tr><td><a href="/test">Test an API request</a></td>' + '<td>Submit an API request and see a formatted JSON response. ' + ' Go through the authorization flow if there are no stored ' + ' credentials for the user.</td></tr>' + '<tr><td><a href="/authorize">Test the auth flow directly</a></td>' + '<td>Go directly to the authorization flow. If there are stored ' + ' credentials, you still might not be prompted to reauthorize ' + ' the application.</td></tr>' + '<tr><td><a href="/revoke">Revoke current credentials</a></td>' + '<td>Revoke the access token associated with the current user ' + ' session. After revoking credentials, if you go to the test ' + ' page, you should see an <code>invalid_grant</code> error.' + '</td></tr>' + '<tr><td><a href="/clear">Clear Flask session credentials</a></td>' + '<td>Clear the access token currently stored in the user session. ' + ' After clearing the token, if you <a href="/test">test the ' + ' API request</a> again, you should go back to the auth flow.' + '</td></tr></table>') if __name__ == '__main__': # When running locally, disable OAuthlib's HTTPs verification. # ACTION ITEM for developers: # When running in production *do not* leave this option enabled. os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # Specify a hostname and port that are set as a valid redirect URI # for your API project in the Google API Console. app.run('localhost', 8080, debug=True)
Ruby
En este ejemplo, se usa el framework Sinatra.
require 'google/apis/youtube_v3' require 'google/api_client/client_secrets' require 'json' require 'sinatra' enable :sessions set :session_secret, 'setme' get '/' do unless session.has_key?(:credentials) redirect to('/oauth2callback') end client_opts = JSON.parse(session[:credentials]) auth_client = Signet::OAuth2::Client.new(client_opts) youtube = Google::Apis::YoutubeV3::YouTubeService.new channel = youtube.list_channels(part, :mine => mine, options: { authorization: auth_client }) "<pre>#{JSON.pretty_generate(channel.to_h)}</pre>" end get '/oauth2callback' do client_secrets = Google::APIClient::ClientSecrets.load auth_client = client_secrets.to_authorization auth_client.update!( :scope => 'https://www.googleapis.com/auth/youtube.force-ssl', :redirect_uri => url('/oauth2callback')) if request['code'] == nil auth_uri = auth_client.authorization_uri.to_s redirect to(auth_uri) else auth_client.code = request['code'] auth_client.fetch_access_token! auth_client.client_secret = nil session[:credentials] = auth_client.to_json redirect to('/') end end
Node.js
Para ejecutar este ejemplo, haz lo siguiente:
-
En API Console, agrega la URL de la máquina local a la lista de URLs de redireccionamiento. Por ejemplo, agrega
http://localhost
. - Asegúrate de tener instalados las LTS de mantenimiento, las LTS activas o la versión actual de Node.js.
-
Crea un directorio nuevo y cámbialo. Por ejemplo:
mkdir ~/nodejs-oauth2-example cd ~/nodejs-oauth2-example
-
Install the
Google API Client
Library
for Node.js using npm:
npm install googleapis
-
Crea los archivos
main.js
con el siguiente contenido. -
Ejecuta el ejemplo:
node .\main.js
main.js
const http = require('http'); const https = require('https'); const url = require('url'); const { google } = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI. * To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Drive activity. const scopes = [ 'https://www.googleapis.com/auth/drive.metadata.readonly' ]; // Generate a url that asks permissions for the Drive activity scope const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true }); /* Global variable that stores user credential in this code example. * ACTION ITEM for developers: * Store user's refresh token in your data store if * incorporating this code into your real app. * For more information on handling refresh tokens, * see https://github.com/googleapis/google-api-nodejs-client#handling-refresh-tokens */ let userCredential = null; async function main() { const server = http.createServer(async function (req, res) { // Example on redirecting user to Google's OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google's OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // An error response e.g. error=access_denied console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); /** Save credential to the global variable in case access token was refreshed. * ACTION ITEM: In a production app, you likely want to save the refresh token * in a secure persistent database instead. */ userCredential = tokens; // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { if (err1) return console.log('The API returned an error: ' + err1); const files = res1.data.files; if (files.length) { console.log('Files:'); files.map((file) => { console.log(`${file.name} (${file.id})`); }); } else { console.log('No files found.'); } }); } } // Example on revoking a token if (req.url == '/revoke') { // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end(); } res.end(); }).listen(80); } main().catch(console.error);
HTTP/REST
En este ejemplo de Python, se usa el framework de Flask y la biblioteca de solicitudes para demostrar el flujo web de OAuth 2.0. Recomendamos usar la biblioteca cliente de la API de Google para Python en este flujo. (en el ejemplo de la pestaña Python se usa la biblioteca cliente).
import json import flask import requests app = flask.Flask(__name__) CLIENT_ID = '123456789.apps.googleusercontent.com' CLIENT_SECRET = 'abc123' # Read from a file or environmental variable in a real app SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl' REDIRECT_URI = 'http://example.com/oauth2callback' @app.route('/') def index(): if 'credentials' not in flask.session: return flask.redirect(flask.url_for('oauth2callback')) credentials = json.loads(flask.session['credentials']) if credentials['expires_in'] <= 0: return flask.redirect(flask.url_for('oauth2callback')) else: headers = {'Authorization': 'Bearer {}'.format(credentials['access_token'])} req_uri = 'https://www.googleapis.com/youtube/v3/channels/list' r = requests.get(req_uri, headers=headers) return r.text @app.route('/oauth2callback') def oauth2callback(): if 'code' not in flask.request.args: auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code' '&client_id={}&redirect_uri={}&scope={}').format(CLIENT_ID, REDIRECT_URI, SCOPE) return flask.redirect(auth_uri) else: auth_code = flask.request.args.get('code') data = {'code': auth_code, 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'redirect_uri': REDIRECT_URI, 'grant_type': 'authorization_code'} r = requests.post('https://oauth2.googleapis.com/token', data=data) flask.session['credentials'] = r.text return flask.redirect(flask.url_for('index')) if __name__ == '__main__': import uuid app.secret_key = str(uuid.uuid4()) app.debug = False app.run()
Reglas de validación de URI de redireccionamiento
Google aplica las siguientes reglas de validación para redireccionar los URI a fin de ayudar a los desarrolladores a mantener sus aplicaciones seguras. Los URI de redireccionamiento deben cumplir con estas reglas. Consulta la sección 3 de RFC 3986 para obtener la definición de dominio, host, ruta de acceso, consulta, esquema y userinfo, que se menciona a continuación.
Reglas de validación | |
---|---|
Esquema |
Los URI de redireccionamiento deben usar el esquema HTTPS, no HTTP simple. Los URI de Localhost (incluidos los URI de dirección IP de localhost) están exentos de esta regla. |
Host |
Los hosts no pueden ser direcciones IP sin procesar. Las direcciones IP de Localhost están exentas de esta regla. |
Dominio |
“googleusercontent.com” .goo.gl ), a menos que la app sea propietaria del dominio. Además, si una app que posee un dominio más acortado elige redireccionar a ese dominio, ese URI de redireccionamiento debe contener “/google-callback/” en su ruta o terminar con “/google-callback” . |
Información del usuario |
Los URI de redireccionamiento no pueden contener el subcomponente userinfo. |
Ruta de acceso |
Los URI de redireccionamiento no pueden contener un recorrido de ruta de acceso (también conocido como seguimiento de directorio), que se representa con un |
Consulta |
Los URI de redireccionamiento no pueden contener redireccionamientos abiertos. |
Fragmento |
Los URI de redireccionamiento no pueden contener el componente del fragmento. |
Caracteres |
Los URI de redireccionamiento no pueden contener ciertos caracteres, incluidos los siguientes:
|
Autorización incremental
En el protocolo OAuth 2.0, tu app solicita autorización para acceder a los recursos, que se identifican con permisos. Se considera una práctica recomendada de experiencia del usuario solicitar autorización para los recursos en el momento en que los necesitas. Para habilitar esa práctica, el servidor de autorización de Google admite la autorización incremental. Esta función te permite solicitar permisos a medida que se necesiten y, si el usuario otorga permiso para el permiso nuevo, mostrará un código de autorización que se podrá intercambiar por un token que contenga todos los permisos que el usuario haya otorgado al proyecto.
Por ejemplo, supongamos que una app ayuda a los usuarios a identificar eventos locales interesantes. La app les permite a los usuarios ver videos sobre los eventos, calificarlos y agregarlos a listas de reproducción. Los usuarios también pueden usar la app para agregar eventos a sus Calendarios de Google.
En ese caso, es posible que la app no necesite ni solicite acceso a los permisos durante el acceso. Sin embargo, si el usuario intentó calificar un video, agregar un video a una lista de reproducción o realizar otra acción en YouTube, la app podría solicitar acceso al alcance https://www.googleapis.com/auth/youtube.force-ssl
.
Del mismo modo, la app podría solicitar acceso al alcance https://www.googleapis.com/auth/calendar
si el usuario intentó agregar un evento de calendario.
A fin de implementar la autorización incremental, completa el flujo normal para solicitar un token de acceso, pero asegúrate de que la solicitud de autorización incluya permisos otorgados con anterioridad. Este enfoque permite que tu app evite tener que administrar varios tokens de acceso.
Las siguientes reglas se aplican a un token de acceso obtenido de una autorización incremental:
- El token se puede usar para acceder a los recursos correspondientes a cualquiera de los permisos implementados en la nueva autorización combinada.
- Cuando usas el token de actualización para que la autorización combinada obtenga un token de acceso, este representa la autorización combinada y se puede usar para cualquiera de los valores de
scope
incluidos en la respuesta. - La autorización combinada incluye todos los permisos que el usuario otorgó al proyecto de API, incluso si se solicitaron permisos de diferentes clientes. Por ejemplo, si un usuario otorga acceso a un alcance con el cliente de escritorio de una aplicación y, luego, otorga otro alcance a la misma aplicación a través de un cliente de dispositivos móviles, la autorización combinada incluirá ambos permisos.
- Si revocas un token que representa una autorización combinada, el acceso a todos los alcances de esa autorización en nombre del usuario asociado se revoca simultáneamente.
Las muestras de código específicas del lenguaje que se indican en el Paso 1: Establece parámetros de autorización y la URL de redireccionamiento HTTP/REST de ejemplo en el Paso 2: Redirecciona al servidor OAuth 2.0 de Google con autorización incremental. En los siguientes ejemplos de código, también se muestra el código que debes agregar para usar la autorización incremental.
PHP
$client->setIncludeGrantedScopes(true);
Python
En Python, configura el argumento de palabra clave include_granted_scopes
en true
para asegurarte de que una solicitud de autorización incluya permisos otorgados con anterioridad. Es muy posible que include_granted_scopes
no sea el único argumento de palabra clave que establezcas, como se muestra en el siguiente ejemplo.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
Ruby
auth_client.update!( :additional_parameters => {"include_granted_scopes" => "true"} )
Node.js
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
HTTP/REST
En este ejemplo, la aplicación que realiza la llamada solicita acceso para recuperar los datos de YouTube Analytics del usuario, además de cualquier otro acceso que el usuario haya otorgado a la aplicación.
GET https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyt-analytics.readonly& access_type=offline& state=security_token%3D138rk%3Btarget_url%3Dhttp...index& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=code& client_id=client_id& include_granted_scopes=true
Refreshing an access token (offline access)
Access tokens periodically expire and become invalid credentials for a related API request. You can refresh an access token without prompting the user for permission (including when the user is not present) if you requested offline access to the scopes associated with the token.
- If you use a Google API Client Library, the client object refreshes the access token as needed as long as you configure that object for offline access.
- If you are not using a client library, you need to set the
access_type
HTTP query parameter tooffline
when redirecting the user to Google's OAuth 2.0 server. In that case, Google's authorization server returns a refresh token when you exchange an authorization code for an access token. Then, if the access token expires (or at any other time), you can use a refresh token to obtain a new access token.
Requesting offline access is a requirement for any application that needs to access a Google
API when the user is not present. For example, an app that performs backup services or
executes actions at predetermined times needs to be able to refresh its access token when the
user is not present. The default style of access is called online
.
Server-side web applications, installed applications, and devices all obtain refresh tokens during the authorization process. Refresh tokens are not typically used in client-side (JavaScript) web applications.
PHP
If your application needs offline access to a Google API, set the API client's access type to
offline
:
$client->setAccessType("offline");
Una vez que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las API de Google en nombre del usuario cuando está sin conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
Python
En Python, configura el argumento de palabra clave access_type
en offline
para asegurarte de que podrás actualizar el token de acceso sin tener que volver a solicitar el permiso al usuario. Es muy posible que access_type
no sea el único argumento de palabra clave que establezcas, como se muestra en el siguiente ejemplo.
authorization_url, state = flow.authorization_url( # Enable offline access so that you can refresh an access token without # re-prompting the user for permission. Recommended for web server apps. access_type='offline', # Enable incremental authorization. Recommended as a best practice. include_granted_scopes='true')
Una vez que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las API de Google en nombre del usuario cuando está sin conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
Ruby
Si tu aplicación necesita acceso sin conexión a una API de Google, configura el tipo de acceso del cliente de la API como offline
:
auth_client.update!( :additional_parameters => {"access_type" => "offline"} )
Una vez que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las API de Google en nombre del usuario cuando está sin conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
Node.js
Si tu aplicación necesita acceso sin conexión a una API de Google, configura el tipo de acceso del cliente de la API como offline
:
const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as a best practice. include_granted_scopes: true });
Una vez que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las API de Google en nombre del usuario cuando está sin conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
Los tokens de acceso vencen. Esta biblioteca usará automáticamente un token de actualización para obtener un token de acceso nuevo si está a punto de vencer. Una forma fácil de asegurarte de almacenar siempre los tokens más recientes es usar el evento de tokens:
oauth2Client.on('tokens', (tokens) => { if (tokens.refresh_token) { // store the refresh_token in your secure persistent database console.log(tokens.refresh_token); } console.log(tokens.access_token); });
Este evento de tokens solo ocurre en la primera autorización y debes establecer el access_type
en offline
cuando llames al método generateAuthUrl
para recibir el token de actualización. Si ya le otorgaste a tu app los permisos necesarios sin establecer las restricciones adecuadas para recibir un token de actualización, deberás volver a autorizar a la aplicación para que reciba un token de actualización nuevo.
Para configurar refresh_token
más adelante, puedes usar el método setCredentials
:
oauth2Client.setCredentials({ refresh_token: `STORED_REFRESH_TOKEN` });
Una vez que el cliente tenga un token de actualización, los tokens de acceso se adquirirán y actualizarán automáticamente en la siguiente llamada a la API.
HTTP/REST
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 |
Es 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 debe establecerse en refresh_token . |
refresh_token |
El token de actualización que muestra el intercambio de código de autorización. |
En el siguiente fragmento, se muestra una solicitud de muestra:
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 mostrará un objeto JSON que contiene un token de acceso nuevo. En el siguiente fragmento, se muestra una respuesta de muestra:
{ "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 en la cantidad de tokens de actualización que se emitirán; un límite por combinación cliente/usuario y otro por usuario en todos los clientes. Debes guardar tokens de actualización en el almacenamiento a largo plazo y continuar usándolos mientras sean válidos. Si tu aplicación solicita demasiados tokens de actualización, es posible que alcance estos límites. En ese caso, los tokens de actualización más antiguos dejarán de funcionar.
Cómo revocar un token
En algunos casos, es posible que un usuario quiera revocar el acceso otorgado a una aplicación. Un usuario puede revocar el acceso desde la Configuración de la cuenta. Para obtener más información, consulta la sección Cómo quitar el acceso de sitios o apps de los sitios y apps de terceros que pueden acceder a tu cuenta.
También es posible que una aplicación revoque de manera 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 cambian de manera significativa los recursos de API que requiere una app. 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.
PHP
Para revocar un token de manera programática, llama a revokeToken()
:
$client->revokeToken();
Python
Para revocar un token de manera programática, realiza una solicitud a https://oauth2.googleapis.com/revoke
que incluya el token como parámetro y configure el encabezado Content-Type
:
requests.post('https://oauth2.googleapis.com/revoke', params={'token': credentials.token}, headers = {'content-type': 'application/x-www-form-urlencoded'})
Ruby
Para revocar un token de manera programática, realiza una solicitud HTTP al extremo oauth2.revoke
:
uri = URI('https://oauth2.googleapis.com/revoke') response = Net::HTTP.post_form(uri, 'token' => auth_client.access_token)
Puede ser un token de acceso o de actualización. Si es un token de acceso y tiene un token de actualización correspondiente, este último también se revocará.
Si la revocación se procesa correctamente, el código de estado de la respuesta es 200
. Para las condiciones de error, se muestra un código de estado 400
junto con un código de error.
Node.js
Para revocar un token de manera programática, realiza una solicitud HTTPS POST al extremo /revoke
:
const https = require('https'); // Build the string for the POST request let postData = "token=" + userCredential.access_token; // Options for POST request to Google's OAuth 2.0 server to revoke a token let postOptions = { host: 'oauth2.googleapis.com', port: '443', path: '/revoke', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData) } }; // Set up the request const postReq = https.request(postOptions, function (res) { res.setEncoding('utf8'); res.on('data', d => { console.log('Response: ' + d); }); }); postReq.on('error', error => { console.log(error) }); // Post the request with data postReq.write(postData); postReq.end();
El parámetro del token puede ser un token de acceso o un token de actualización. Si es un token de acceso y tiene un token de actualización correspondiente, este último también se revocará.
Si la revocación se procesa correctamente, el código de estado de la respuesta es 200
. Para las condiciones de error, se muestra un código de estado 400
junto con un código de error.
HTTP/REST
Para revocar un token de manera programática, la aplicación realiza 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}
Puede ser un token de acceso o de actualización. Si es un token de acceso y tiene un token de actualización correspondiente, este último 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.