最近R編看了鬼滅之刃的動畫、漫畫及電影,心血來潮用VYOND做一支模擬鬼滅的動畫,從腳本到剪輯總共花 ... ... <看更多>
「vyond中文」的推薦目錄:
- 關於vyond中文 在 Vyond-教學影片製作的7個秘訣–博識通資訊 - YouTube 的評價
- 關於vyond中文 在 Vyond動畫創意應用| 五步驟學會製作一分鐘鬼滅之刃動畫 的評價
- 關於vyond中文 在 Vyond 動畫製作解決方案--博識通資訊 - YouTube 的評價
- 關於vyond中文 在 Vyond - 文藻線上華語教學 的評價
- 關於vyond中文 在 簡單動畫網站整理(知識型youtuber愛用) | 方格子 的評價
- 關於vyond中文 在 Welcome To My Official YouTube Channel! [Vyond]转换为中文 ... 的評價
- 關於vyond中文 在 OAuth 2.0 Flow: Server-side web apps | YouTube Data API 的評價
vyond中文 在 Vyond 動畫製作解決方案--博識通資訊 - YouTube 的推薦與評價
博識通資訊提供全方位數位學習解決方案,服務項目為:Moodle 數位學習平台:https://bit.ly/2NamyNDiSpring ... ... <看更多>
vyond中文 在 Vyond - 文藻線上華語教學 的推薦與評價
但是中文字對於外國人來說真的是一大難題 這時就可以利用筆順來幫助學生記住 ♀️ 因此在線上華語教學時 ... ... <看更多>
vyond中文 在 簡單動畫網站整理(知識型youtuber愛用) | 方格子 的推薦與評價
powtoon:各種動畫類型都有包含vyond:文森說書頻道最愛用TEMPLATES:有許多模板可套用,只需依自己需求些微更改內容即可。 videoscribe:手繪白板動畫 ... ... <看更多>
vyond中文 在 Welcome To My Official YouTube Channel! [Vyond]转换为中文 ... 的推薦與評價
Welcome To My Official YouTube Channel! [Vyond]转换为中文(简体) 通过互联网从书籍,电影和播客中学习英语。字幕,即时翻译,一键保存新单词和许多有趣的部分- ... ... <看更多>
vyond中文 在 OAuth 2.0 Flow: Server-side web apps | YouTube Data API 的推薦與評價
En este documento, se explica cómo las aplicaciones de servidor web usan las bibliotecas cliente de la API de Google o los extremos de Google OAuth 2.0 para implementar la autorización OAuth 2.0 y acceder a la API de datos de YouTube.
OAuth 2.0 permite a los usuarios compartir datos específicos con una aplicación y, al mismo tiempo, mantiene la privacidad de sus nombres de usuario, contraseñas y otra información.
Por ejemplo, una aplicación puede usar OAuth 2.0 para obtener permiso y subir videos al canal de YouTube de un usuario.
Este flujo de OAuth 2.0 está destinado específicamente a la autorización del usuario. Está diseñada para aplicaciones
que pueden almacenar información confidencial y mantener el estado. Una aplicación de servidor web debidamente autorizada puede acceder a una API mientras el usuario interactúa con la aplicación 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 llaman a las APIs 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 es compatible con el flujo de cuentas de servicio solo para los propietarios del contenido de YouTube que poseen y administran varios canales de la plataforma.
Específicamente, los propietarios del contenido pueden usar cuentas de servicio para llamar a los métodos de la API que admiten el parámetro de solicitud onBehalfOfContentOwner
.
Nota: Dadas las implicaciones de seguridad de realizar la implementación correcta, te recomendamos que uses las bibliotecas de OAuth 2.0 cuando interactúes con los extremos de OAuth 2.0 de Google. Una práctica recomendada es usar código bien depurado proporcionado por otros usuarios, ya que te ayudará a protegerte a ti y a tus usuarios. Para obtener más información, consulta Bibliotecas cliente.
Bibliotecas cliente
En los ejemplos específicos para cada lenguaje de esta página, se usan bibliotecas cliente de la API de Google para implementar la autorización de OAuth 2.0. Para ejecutar las muestras de código, primero debes instalar la biblioteca cliente de tu lenguaje.
Cuando usas una biblioteca cliente de la API de Google para manejar el flujo de OAuth 2.0 de tu aplicación, la biblioteca cliente realiza muchas acciones que la aplicación, de otro modo, tendría que realizar por su cuenta. Por ejemplo, determina cuándo la aplicación puede usar o actualizar tokens de acceso almacenados y cuándo debe obtener el consentimiento. La biblioteca cliente también genera URL de redireccionamiento correctas y ayuda a implementar controladores de redireccionamiento que intercambien 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:
Go
Java
.NET
Node.js
PHP
Python
Ruby
Importante: La biblioteca cliente de la API de Google para JavaScript y Acceder con Google solo están diseñadas para controlar OAuth 2.0 en el navegador del usuario. Si quieres usar JavaScript en el servidor para administrar las interacciones de OAuth 2.0 con Google, considera usar la biblioteca de Node.js en tu plataforma de backend.
Requisitos previos
Habilita las API para tu proyecto.
Cualquier aplicación que llame a las APIs de Google debe habilitarlas en 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 otras APIs 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 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 para 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 Aplicación web.
Completa el formulario y haz 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 las pruebas, puedes especificar URI que hagan referencia a la máquina local, como http://localhost:8080
. Teniendo esto en cuenta, ten en cuenta que todos los ejemplos de este documento usan http://localhost:8080
como URI de redireccionamiento.
Te recomendamos diseñar los extremos de autenticación de tu app para que esta no exponga los códigos de autorización a otros recursos de la página.
Después de crear tus credenciales, descarga el archivo client_secret.json de API Console. Almacena el archivo de forma segura en una ubicación a la que solo
pueda acceder tu aplicación.
Identifica los permisos de acceso
Los permisos permiten que tu aplicación solo solicite acceso a los recursos que necesita, a la vez que permiten que los usuarios controlen la cantidad de acceso que le otorgan a tu aplicación. Por lo tanto, puede existir una relación inversa entre la cantidad de permisos solicitados y la probabilidad de obtener el consentimiento del usuario.
Antes de que comiences 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 tu aplicación solicite acceso a los permisos de autorización a través de un proceso de autorización incremental, en el que solicitará 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 versión 3 de la API de datos de YouTube utiliza los siguientes alcances:
Permisos
https://www.googleapis.com/auth/youtubeAdministrar tu cuenta de YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creatorVer 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-sslVea, edite y borre de forma permanente sus videos, calificaciones, comentarios y subtítulos de YouTube
https://www.googleapis.com/auth/youtube.readonlyPermite ver tu cuenta de YouTube.
https://www.googleapis.com/auth/youtube.uploadPermite administrar tus videos de YouTube.
https://www.googleapis.com/auth/youtubepartnerVer y administrar sus elementos y el contenido asociado en YouTube
https://www.googleapis.com/auth/youtubepartner-channel-auditPermite ver información privada de tu canal de YouTube que sea relevante durante el proceso de auditoría con un socio de YouTube.
En el documento Alcances de la API de OAuth 2.0, se incluye una lista completa de los alcances que puedes usar para acceder a las API de Google.
Si tu aplicación pública usa permisos que permiten acceder a ciertos datos del usuario, debe completar un proceso de verificación. Si ves una app no verificada en la pantalla cuando pruebas tu aplicación, debes enviar una solicitud de verificación para quitarla. Obtén más información sobre las
apps sin verificar
y consulta las respuestas a las
preguntas frecuentes sobre la verificación de apps en el Centro de ayuda.
Requisitos de lenguaje específico
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, consulta también los requisitos específicos del lenguaje a continuación.
Para ejecutar las muestras de código de 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 instaladas
La herramienta de administración de dependencias Composer
La biblioteca cliente de las APIs de Google para PHP tiene las siguientes características:
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.
La biblioteca cliente de las APIs de Google para Python:
pip install --upgrade google-api-python-client
Los valores
google-auth
, google-auth-oauthlib
y google-auth-httplib2
para la autorización del usuario.
pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
El framework de aplicaciones web de Flask en Python.
pip install --upgrade flask
La biblioteca HTTP
requests
pip install --upgrade requests
Rita
Para ejecutar las muestras de código de Ruby en este documento, necesitarás lo siguiente:
Ruby 2.6 o superior
La biblioteca de Google Auth para Ruby:
gem install googleauth
Framework de 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 de Node.js de las APIs de Google:
npm install googleapis crypto express express-session
HTTP o REST
No necesitas instalar ninguna biblioteca para poder 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 interactúa tu aplicación con el servidor OAuth 2.0 de Google a fin de obtener el consentimiento de un usuario para realizar una solicitud a la API en su nombre. Tu aplicación debe tener ese consentimiento para poder ejecutar una solicitud a la API de Google que requiera la autorización del usuario.
La siguiente lista resume 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 otorga los permisos a tu aplicación.
Tu aplicación averigua qué decidió el usuario.
Si el usuario otorgó los permisos solicitados, tu aplicación recupera los tokens necesarios para realizar solicitudes a la API en nombre del usuario.
Paso 1: Establece 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 se le pedirá al usuario que otorgue 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 establecerás los parámetros en ella.
Las pestañas que aparecen 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.
El siguiente fragmento de código crea un objeto Google\Client()
, que define los parámetros de 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 para acceder y la URL del extremo de autenticación de la 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:
Python
$client = new Google\Client();// Required, call the setAuthConfig function to load authorization credentials from
// client_secret.json file.
$client->setAuthConfig('client_secret.json');// Required, to set the scope value, call the addScope function
$client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL);// Required, call the setRedirectUri function to specify a valid redirect URI for the
// provided client_id
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');// Recommended, 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');// Recommended, call the setState function. Using a state value can increase your assurance that
// an incoming connection is the result of an authentication request.
$client->setState($sample_passthrough_value);// Optional, if your application knows which user is trying to authenticate, it can use this
// parameter to provide a hint to the Google Authentication Server.
$client->setLoginHint('hint@example.com');// Optional, call the setPrompt function to set "consent" will prompt the user for consent
$client->setPrompt('consent');// Optional, call the setIncludeGrantedScopes function with true to enable incremental
// authorization
$client->setIncludeGrantedScopes(true);
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 las credenciales de autorización. Ese objeto también identifica los permisos a los que tu aplicación solicita permiso para acceder y la URL del extremo de autenticación de la 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:
Rita
import google.oauth2.credentials
import google_auth_oauthlib.flow# Required, call the from_client_secrets_file method to retrieve the client ID from a
# client_secret.json file. The client ID (from that file) and access scopes are required. (You can
# also use the from_client_config method, which passes the client configuration as it originally
# appeared in a client secrets file but doesn't access the file itself.)
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
'client_secret.json',
scopes=['https://www.googleapis.com/auth/youtube.force-ssl'])# Required, 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(
# Recommended, 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',
# Optional, enable incremental authorization. Recommended as a best practice.
include_granted_scopes='true',
# Optional, if your application knows which user is trying to authenticate, it can use this
# parameter to provide a hint to the Google Authentication Server.
login_hint='hint@example.com',
# Optional, set prompt to 'consent' will prompt the user for consent
prompt='consent')
Usa el archivo client_secrets.json que creaste para configurar un objeto cliente en tu
aplicación. Cuando configuras un objeto de cliente, debes especificar los permisos a los que debe acceder tu 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 "googleauth"
require 'googleauth/stores/redis_token_store'client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json')
scope = 'https://www.googleapis.com/auth/youtube.force-ssl'
token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope, token_store, '/oauth2callback')
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 solicitudes HTTP.
Node.js
En el siguiente fragmento de código, se crea un objeto google.auth.OAuth2
, que define los parámetros de la solicitud de autorización.
Ese objeto usa información de tu archivo client_secret.json para identificar tu aplicación. Si quieres
solicitarle permisos a un usuario para recuperar un token de acceso, se lo redirecciona a una página de consentimiento.
Para crear una URL de la página de consentimiento, haz lo siguiente:
const {google} = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');/**
* 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 secure random state value.
const state = crypto.randomBytes(32).toString('hex');// Store state in the session
req.session.state = state;// 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,
// Include the state parameter to reduce the risk of CSRF attacks.
state: state
});
Nota importante: El refresh_token
solo se muestra en la primera autorización. Obtén más detalles
aquí.
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 a través de HTTPS. Se rechazan las conexiones HTTP simples.
El servidor de autorización de Google admite los siguientes parámetros de cadena de consulta para aplicaciones de servidor web:
Parámetros
client_id
Obligatorio
El ID de cliente de tu aplicación. Puedes encontrar este valor en API Console
Credentials page.
redirect_uri
Obligatorio
Determina a dónde redirecciona el servidor de la API una vez que el usuario 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 objeto Credentials page
API Console
de tu cliente. Si este valor no coincide con un URI de redireccionamiento autorizado para el client_id
proporcionado, se mostrará un error redirect_uri_mismatch
.
Ten en cuenta que el esquema http
o https
, las mayúsculas y minúsculas, y la barra final (“/
”) deben coincidir.
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 code
para las aplicaciones de servidor web.
scope
Obligatorio
Una lista delimitada por espacios de alcances 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.
Los permisos permiten que tu aplicación solo solicite acceso a los recursos que necesita, a la vez que permiten que los usuarios controlen la cantidad de acceso que le otorgan a tu aplicación. Por lo tanto, existe una relación inversa entre la cantidad de permisos solicitados y la probabilidad de obtener el consentimiento del usuario.
La versión 3 de la API de datos de YouTube utiliza los siguientes alcances:
Permisos
https://www.googleapis.com/auth/youtubeAdministrar tu cuenta de YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creatorVer 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-sslVea, edite y borre de forma permanente sus videos, calificaciones, comentarios y subtítulos de YouTube
https://www.googleapis.com/auth/youtube.readonlyPermite ver tu cuenta de YouTube.
https://www.googleapis.com/auth/youtube.uploadPermite administrar tus videos de YouTube.
https://www.googleapis.com/auth/youtubepartnerVer y administrar sus elementos y el contenido asociado en YouTube
https://www.googleapis.com/auth/youtubepartner-channel-auditPermite ver información privada de tu canal de YouTube que sea relevante durante el proceso de auditoría con un socio de YouTube.
En el documento 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.
Recomendamos que tu aplicación solicite acceso a los permisos de autorización en contexto siempre que sea posible. Cuando solicitas acceso a los datos del usuario en contexto, a través de la autorización incremental, ayudas a que los usuarios comprendan con mayor facilidad por qué tu aplicación necesita el acceso que está solicitando.
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 válidos de los parámetros son online
, que es el valor predeterminado, y offline
.
Establece el valor en offline
si tu aplicación necesita actualizar los tokens de acceso cuando el usuario no está presente en el navegador. Este es el método para actualizar los tokens de acceso que se describe más adelante en este documento. Este valor le indica al servidor de autorización de Google que muestre un token de actualización y un token de acceso la primera vez que tu aplicación intercambia un código de autorización para tokens.
state
Se recomienda
Especifica cualquier valor de cadena que tu aplicación use 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 de name=value
en el componente de consulta de URL (?
) de redirect_uri
después de que el usuario otorga su consentimiento o rechaza la solicitud de acceso de tu aplicación.
Puedes usar este parámetro para varios fines, como dirigir al usuario al recurso correcto en tu aplicación, enviar nonces y mitigar la falsificación de solicitudes entre sitios. Dado que tu redirect_uri
se puede adivinar, usar un valor state
puede aumentar la seguridad de que una conexión entrante es el resultado de una solicitud de autenticación. Si generas una cadena aleatoria o codificas el hash de una cookie o de otro valor que captura el estado del cliente, puedes validar la respuesta para asegurarte, además, de que la solicitud y la respuesta se hayan originado en el mismo navegador, lo que brinda protección contra ataques como la falsificación de solicitudes entre sitios. Consulta la documentación de OpenID Connect para ver un ejemplo de cómo crear y confirmar un token state
.
Importante: El cliente de OAuth debe evitar la CSRF, como se indica en la especificación de OAuth2
. Una forma de lograrlo es usar el parámetro
state
para mantener el estado entre tu solicitud de autorización y la respuesta del servidor de autorización.include_granted_scopes
Opcional
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 true
y se otorga la solicitud de autorización, el token de acceso nuevo también abarcará todos los permisos a los que el usuario otorgó acceso a la aplicación con anterioridad. Consulta la sección de autorización incremental para ver ejemplos.
enable_granular_consent
Opcional
La configuración predeterminada es true
. Si se configura como false
, se inhabilitarán los permisos más detallados de la Cuenta de Google para los ID de cliente de OAuth creados antes de 2019. No hay efecto en los IDs de cliente de OAuth más recientes, ya que siempre se habilitan permisos más detallados para ellos.
Cuando Google habilita permisos detallados para una aplicación, este parámetro ya no tendrá ningún efecto.
login_hint
Opcional
Si tu aplicación sabe qué usuario intenta autenticarse, puede usar este parámetro para proporcionar una sugerencia al servidor de autenticación de Google. El servidor usa la sugerencia para simplificar el flujo de acceso, ya sea completando previamente el campo de correo electrónico en el formulario de acceso o seleccionando la sesión de acceso múltiple adecuada.
Establece el valor del parámetro en una dirección de correo electrónico o un identificador sub
, que es equivalente al ID de Google del usuario.
prompt
Opcional
Una lista de mensajes para el usuario delimitados por espacios y que distinguen mayúsculas de minúsculas. Si no especificas este parámetro, se le solicitará al usuario solo la primera vez que tu proyecto solicite acceso. Consulta
Cómo solicitar un nuevo consentimiento para obtener más información.
Los valores posibles son:
none
No muestres ninguna pantalla de autenticación ni de consentimiento. No se debe especificar con otros valores.
consent
Solicita el consentimiento del usuario.
select_account
Solicítale al usuario que seleccione una cuenta.
Paso 2: Redirecciona al servidor OAuth 2.0 de Google
Redireccionar 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 por primera vez a los datos del usuario. En el caso de la autorización incremental, este paso también se produce cuando tu aplicación necesita acceder por primera vez a recursos adicionales a los que aún no tiene permiso.
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 aplicaciones web Flask:
Rita
return flask.redirect(authorization_url)
Genera una URL para solicitar acceso desde el servidor OAuth 2.0 de Google:
auth_uri = authorizer.get_authorization_url(login_hint: user_id, request: request)
Redireccionar al usuario a
auth_uri
Node.js
Usa la URL generada
authorizationUrl
del método generateAuthUrl
del Paso 1 para solicitar acceso al servidor OAuth 2.0 de Google.Redireccionar al usuario a
authorizationUrl
res.redirect(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 thestate
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_idDespués de crear la URL de la solicitud, redirecciona al usuario a ella.
El servidor 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 de vuelta a tu aplicación con la URL de redireccionamiento que especificaste.
Paso 3: Google solicita el consentimiento del usuarioEn este paso, el usuario decide si otorgará a tu aplicación el acceso solicitado. En esta etapa, Google muestra una ventana de consentimiento con el nombre de tu aplicación y los servicios de la API de Google a los que solicita permiso para acceder con las credenciales de autorización del usuario, y un resumen de los permisos de acceso que se otorgarán. Luego, el usuario puede dar su consentimiento para otorgar acceso a uno o más permisos solicitados por tu aplicación, o rechazar la solicitud.
Tu aplicación no necesita realizar ninguna acción en esta etapa mientras espera la respuesta del servidor OAuth 2.0 de Google que indica si se otorgó algún acceso. Esa respuesta se explica en el siguiente paso.
Errores
Las solicitudes al extremo de autorización de OAuth 2.0 de Google pueden mostrar mensajes de error para el usuario en lugar de los flujos esperados de autenticación y autorización. A continuación, se indican los códigos de error comunes y las soluciones 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 sensibles y
restringidos hasta que se otorgue acceso de forma explícita a tu ID de cliente de OAuth.
disallowed_useragent
El extremo de autorización se muestra dentro de un usuario-agente incorporado que las Políticas de OAuth 2.0 de Google no admiten.
Android
Los desarrolladores de Android pueden encontrar 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 los controladores de Android App Links o la app de navegador predeterminada. También se admite la biblioteca de pestañas personalizadas de Android.
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 los controladores de vínculos universales o la app de navegador predeterminada. También se admite la biblioteca SFSafariViewController
.
org_internal
El ID de cliente de OAuth en la solicitud forma parte de un proyecto que limita el acceso a las Cuentas de Google en una
organización de Google Cloud específica.
Para obtener más información sobre esta opción de configuración, consulta la sección Tipo de usuario del artículo de ayuda Configura tu pantalla de consentimiento de OAuth.
invalid_client
El secreto del cliente de OAuth es incorrecto. Revisa la configuración del cliente de OAuth, incluido el ID y el secreto de cliente que se usaron para esta solicitud.
invalid_grant
Cuando se actualiza un token de acceso o se usa la
autorización incremental, es posible que el token haya vencido o
se haya invalidado.
Vuelve a autenticar al usuario y pídele su consentimiento para obtener tokens nuevos. Si sigues viendo este error, asegúrate de que tu aplicación se haya configurado de forma correcta y de usar 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
pasado 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 hacer referencia al flujo fuera de banda de OAuth (OOB) que dejó de estar disponible y ya no se admite. Consulta la guía de migración para actualizar tu integración.
invalid_request
Se produjo un error con la solicitud que hiciste. Esto puede deberse a varios motivos:
La solicitud no tenía el formato correcto
Faltaban parámetros obligatorios en la solicitud
La solicitud usa un método de autorización que Google no admite. Verifica que tu integración
de OAuth use un método de integración recomendado
Paso 4: Controla la respuesta del servidor de OAuth 2.0 Importante: Antes de controlar la respuesta de OAuth 2.0 en el servidor, debes confirmar que el
state
recibido de Google coincida con el state
enviado en la solicitud de autorización. Esta verificación ayuda a garantizar que el usuario, no una secuencia de comandos maliciosa, realice la solicitud y reduce el riesgo de ataques de CSRF.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 no lo aprueba, esta contendrá un mensaje de error. El código de autorización o el mensaje de error que se muestra al servidor web aparecen 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 de código de autorización:
Importante: Si tu extremo de respuesta renderiza una página HTML, cualquier recurso de esa página podrá ver el código de autorización en la URL.
https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7
Las secuencias de comandos pueden leer la URL directamente, y la URL en el encabezado HTTP
Referer
se puede enviar a alguno o todos los recursos de la página. Considera con detenimiento si deseas enviar credenciales de autorización a todos los recursos de esa página (en especial, secuencias de comandos de terceros, como complementos y estadísticas para redes sociales). Para evitar
este problema, recomendamos que el servidor primero controle la solicitud y, luego, redireccione a otra
URL que no incluya los parámetros de respuesta.
Para probar este flujo, haz clic en la siguiente URL de muestra, que solicita acceso de solo lectura para ver los metadatos de los archivos en tu unidad de 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 debería redireccionar a http://localhost/oauth2callback
, que probablemente genere un error 404 NOT FOUND
, a menos que tu máquina local entregue un archivo en esa dirección. En el siguiente paso, se proporcionan más detalles sobre la información que se muestra en el URI cuando se redirecciona al usuario de vuelta a tu aplicación.
acceso
Una vez que el servidor web recibe el código de autorización, puede intercambiarlo por un token de acceso.
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
:
Python
$access_token = $client->getAccessToken();
En tu 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:
Rita
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}
En tu página de devolución de llamada, usa la biblioteca googleauth
para verificar la respuesta del servidor de autorización. Usa el método authorizer.handle_auth_callback_deferred
para guardar el código de autorización y redireccionar a la URL que originalmente solicitó la autorización. De esta manera, se aplaza el intercambio del código mediante el almacenamiento temporal de los resultados en la sesión del usuario.
Node.js
target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
redirect target_url
Para intercambiar un código de autorización por un token de acceso, usa el método getToken
:
HTTP o REST
const url = require('url');// Receive the callback from Google's OAuth 2.0 server.
app.get('/oauth2callback', async (req, res) => {
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 if (q.state !== req.session.state) { //check state value
console.log('State mismatch. Possible CSRF attack');
res.end('State mismatch. Possible CSRF attack');
} else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code);
oauth2Client.setCredentials(tokens);
});
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
El ID de cliente obtenido de API Console
Credentials page.
client_secret
El secreto del cliente obtenido del API Console
Credentials page.
code
El código de autorización que se muestra en la solicitud inicial.
grant_type
Según se define en la especificación de OAuth 2.0, el valor de este campo se debe establecer en
authorization_code
.redirect_uri
Uno de los URI de redireccionamiento enumerados para tu proyecto en el objeto Credentials page de la API Consoledel objeto
client_id
especificado.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-urlencodedcode=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 tu aplicación establece el parámetro access_type
en 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 la 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 token de acceso nuevo. Los tokens de actualización son válidos hasta que el usuario revoque el acceso.
Nuevamente, este campo solo está presente en esta respuesta si configuras el parámetro
access_type
como offline
en la solicitud inicial al 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 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
.Importante: La aplicación debe almacenar ambos tokens en una ubicación segura y de larga duración a la que se pueda acceder entre diferentes invocaciones de la aplicación. El token de actualización permite que tu aplicación obtenga un nuevo token de acceso si el actual vence. Por lo tanto, si tu aplicación pierde el token de actualización, el usuario deberá repetir el flujo de consentimiento de OAuth 2.0 para que tu aplicación pueda obtener un nuevo token de actualización.
En el siguiente fragmento, se muestra una respuesta de muestra:
Nota: Tu aplicación debe ignorar los campos no reconocidos que se incluyan en la respuesta.
{
"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 intercambies el código de autorización por un token de acceso, es posible que encuentres el siguiente error en lugar de la respuesta esperada. A continuación, se indican los códigos de error comunes y las soluciones sugeridas.
invalid_grant
El código de autorización proporcionado no es válido o tiene un formato incorrecto. Para solicitar un código nuevo, reinicia el proceso de OAuth para volver a solicitar el consentimiento del usuario.
Llama a las APIs de Google
Usa el token de acceso para llamar a las APIs de Google. Para ello, sigue estos pasos:
Si necesitas aplicar un token de acceso a un objeto
Google\Client
nuevo (por ejemplo, si almacenaste el token de acceso en la sesión de un usuario), usa el método setAccessToken
:
$client->setAccessToken($access_token);
Compila un objeto de servicio para la API a la que deseas llamar. Para compilar un objeto de servicio, debes proporcionar un objeto
Google\Client
autorizado al constructor para la API a la que deseas llamar. Por ejemplo, para invocar la API de datos de YouTube:
$youtube = new Google_Service_YouTube($client);
Realiza solicitudes al servicio de la API con la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado:
$channel = $youtube->channels->listChannels('snippet', array('mine' => $mine));
Python
Después de obtener un token de acceso, tu aplicación puede usar ese token 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 para compilar un objeto de servicio para la API a la que deseas llamar y, luego, usa ese objeto para 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, debes llamar al método
build
de la biblioteca googleapiclient.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, haz lo siguiente:
from googleapiclient.discovery import buildyoutube = build('youtube', 'v3', credentials=credentials)
Realiza solicitudes al servicio de la API con la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado:
channel = youtube.channels().list(mine=True, part='snippet').execute()
Rita
Después de obtener un token de acceso, tu aplicación puede usar ese token para realizar 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 para compilar un objeto de servicio para la API a la que deseas llamar y, luego, usa ese objeto para realizar solicitudes autorizadas a la API.
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 = credentials
Realiza solicitudes al servicio de la API con la interfaz que proporciona el objeto de servicio.
Por ejemplo, para recuperar datos sobre el canal de YouTube del usuario autorizado:
channel = youtube.list_channels(part, :mine => mine)
Como alternativa, la autorización se puede proporcionar por método si proporcionas 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
, usa el objeto 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.
HTTP o REST
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.');
}
});
Después de que tu aplicación obtenga un token de acceso, puedes usarlo para realizar llamadas a una API de Google en nombre de una cuenta de usuario determinada si se otorgaron los permisos de acceso que requiere la API. Para ello, incluye el token de acceso en una solicitud a la API. Para ello, incluye un parámetro de consulta access_token
o un valor Bearer
de encabezado HTTP Authorization
. Cuando sea posible, se prefiere el encabezado HTTP, ya que las cadenas de consulta suelen ser visibles en los registros del servidor. En la mayoría de los casos, puedes usar una biblioteca cliente para configurar las llamadas a las APIs de Google (por ejemplo, cuando llamas a la API de YouTube Data).
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 solicitudes GET de HTTPUna 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
ejemplosPuedes probar estos comandos con la aplicación de línea de comandos de curl
. Este es un ejemplo en el que se usa la opción de encabezado HTTP (preferida):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true
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
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 para que administre la cuenta de YouTube del usuario.
Para ejecutar este ejemplo, haz lo siguiente:
En API Console, agrega la URL de la máquina local a la lista de URL de redireccionamiento. Por ejemplo, agrega
http://localhost:8080
.Crea un directorio nuevo y cámbialo a él. 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
y oauth2callback.php
con el siguiente contenido.Ejecuta el ejemplo con un servidor web configurado para entregar PHP. Si usas PHP 5.6 o posterior, puedes usar el servidor web de prueba integrado de PHP:
php -S localhost:8080 ~/php-oauth2-example
index.php
oauth2callback.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));
}
Python
<?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'])) {
// Generate and set state value
$state = bin2hex(random_bytes(16));
$client->setState($state);
$_SESSION['state'] = $state; $auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
// Check the state value
if (!isset($_GET['state']) || $_GET['state'] !== $_SESSION['state']) {
die('State mismatch. Possible CSRF attack.');
}
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}
En este ejemplo, se usa el marco de trabajo 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 dirige 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 realiza de forma correcta, la página muestra la respuesta de la API.
Prueba directamente el flujo de autenticación: 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 a la API en nombre del usuario.
Revocar credenciales actuales: Este vínculo dirige a una página que
revoca permisos que el usuario ya otorgó a la aplicación.
Borrar las credenciales de la sesión de Flask: Este vínculo borra las credenciales de autorización almacenadas en la sesión de Flask. Esto te permite ver qué sucedería si un usuario que ya había otorgado permiso a tu app intentara ejecutar una solicitud a la API en una sesión nueva. También te permite ver la respuesta de la API que recibiría tu app si un usuario le otorgara permisos revocados, y esta aún intenta autorizar una solicitud con un token de acceso revocado.
Nota: Para ejecutar este código de manera local, debes haber seguido las instrucciones de la sección de requisitos previos, incluida la configuración de
http://localhost:8080
como un URI de redireccionamiento válido para tus credenciales y la descarga del archivo client_secret.json para esas credenciales en tu directorio de trabajo.Rita
# -*- coding: utf-8 -*-import os
import flask
import requestsimport 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)
En este ejemplo, se usa el framework Sinatra.
Node.js
require 'google/apis/youtube_v3'
require 'sinatra'
require 'googleauth'
require 'googleauth/stores/redis_token_store'configure do
enable :sessions set :client_id, Google::Auth::ClientId.from_file('/path/to/client_secret.json')
set :scope, Google::Apis::DriveV3::AUTH_DRIVE_METADATA_READONLY
set :token_store, Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)
set :authorizer, Google::Auth::WebUserAuthorizer.new(settings.client_id, settings.scope, settings.token_store, '/oauth2callback')
endget '/' do
user_id = settings.client_id.id
credentials = settings.authorizer.get_credentials(user_id, request)
if credentials.nil?
redirect settings.authorizer.get_authorization_url(login_hint: user_id, request: request)
end
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>"
endget '/oauth2callback' do
target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
redirect target_url
end
Para ejecutar este ejemplo, haz lo siguiente:
En API Console, agrega la URL de la máquina local a la lista de URL de redireccionamiento. Por ejemplo, agrega
http://localhost
.Asegúrate de tener instalada la LTS de mantenimiento, la LTS activa o la versión actual de
Node.js.
Crea un directorio nuevo y cámbialo a él. 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 archivosmain.js
con el siguiente contenido.
Ejecuta el ejemplo:node .\main.js.
main.js
HTTP o REST
const http = require('http');
const https = require('https');
const url = require('url');
const { google } = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');/**
* 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'
];
/* 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 app = express(); app.use(session({
secret: 'your_secure_secret_key', // Replace with a strong secret
resave: false,
saveUninitialized: false,
})); // Example on redirecting user to Google's OAuth 2.0 server.
app.get('/', async (req, res) => {
// Generate a secure random state value.
const state = crypto.randomBytes(32).toString('hex');
// Store state in the session
req.session.state = state; // 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,
// Include the state parameter to reduce the risk of CSRF attacks.
state: state
}); res.redirect(authorizationUrl);
}); // Receive the callback from Google's OAuth 2.0 server.
app.get('/oauth2callback', async (req, res) => {
// 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 if (q.state !== req.session.state) { //check state value
console.log('State mismatch. Possible CSRF attack');
res.end('State mismatch. Possible CSRF attack');
} 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
app.get('/revoke', async (req, res) => {
// 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();
});
const server = http.createServer(app);
server.listen(80);
}
main().catch(console.error);
En este ejemplo de Python, se usa el framework Flask y la biblioteca Requests 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 de Python, se usa la biblioteca cliente).
import jsonimport 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:
state = str(uuid.uuid4())
flask.session['state'] = state
auth_uri = ('https://accounts.google.com/o/oauth2/v2/auth?response_type=code'
'&client_id={}&redirect_uri={}&scope={}&state={}').format(CLIENT_ID, REDIRECT_URI,
SCOPE, state)
return flask.redirect(auth_uri)
else:
if 'state' not in flask.request.args or flask.request.args['state'] != flask.session['state']:
return 'State mismatch. Possible CSRF attack.', 400 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 URIs para 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 ver la definición de dominio, host, ruta de acceso, consulta, esquema y userinfo, que se mencionan a continuación.
Reglas de validación
Esquema
Los URI de redireccionamiento deben usar el esquema HTTPS, no el HTTP simple. Los URI de host local (incluidos
los URI de direcciones IP del host local) están exentos de esta regla.
Host
Los hosts no pueden ser direcciones IP sin procesar. Las direcciones IP de host local están exentas de esta regla.
Dominio
Los TLD del host (dominios de nivel superior) deben pertenecer a la lista pública de sufijos.
Los dominios de host no pueden ser
“googleusercontent.com”
.Los URI de redireccionamiento no pueden contener dominios de acortamiento de URL (p.ej.,
goo.gl
), a menos que la app sea propietaria del dominio. Además, si una app que posee un dominio de acortamiento elige redireccionar a ese dominio, ese URI de redireccionamiento debe contener “/google-callback/”
en su ruta de acceso 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 llamado retroceso de directorio), que se representa con un “/..”
o “\..”
, ni con su codificación de URL.
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, como los siguientes:
Caracteres comodín (
'*'
)Caracteres ASCII no imprimibles
Codificaciones porcentuales no válidas (cualquier codificación porcentual que no siga la forma de codificación
de URL de un signo de porcentaje seguido de dos dígitos hexadecimales)
Caracteres nulos (un carácter NULL codificado, p.ej.,
%00
,%C0%80
)Autorización incremental
En el protocolo OAuth 2.0, tu app solicita autorización para acceder a los recursos, que están identificados por permisos. Se considera una práctica recomendada de la experiencia del usuario solicitar autorización para acceder a los recursos en el momento en que los necesitas. Para habilitar esta práctica, el servidor de autorización de Google admite la autorización incremental. Esta función te permite solicitar permisos a medida que sean necesarios y, si el usuario otorga permiso para el permiso nuevo, muestra un código de autorización que se puede intercambiar por un token que contenga todos los permisos que el usuario le otorgó al proyecto.
Por ejemplo, supongamos que una aplicación ayuda a los usuarios a identificar eventos locales interesantes.
La app permite a los usuarios ver videos sobre los eventos, calificarlos y agregarlos a las playlists. Los usuarios también pueden usar la app para agregar eventos a sus Calendarios de Google.
En este caso, cuando accedas, es posible que la app no necesite ni solicite acceso a ningún permiso. Sin embargo, si el usuario intentó calificar un video, agregarlo a una playlist o realizar otra acción de YouTube, la app podría solicitar acceso al permiso https://www.googleapis.com/auth/youtube.force-ssl
.
De manera similar, la app podría solicitar acceso al permiso https://www.googleapis.com/auth/calendar
si el usuario intentó agregar un evento de calendario.
Para implementar la autorización incremental, completa el flujo normal de solicitud de un token de acceso, pero asegúrate de que la solicitud de autorización incluya permisos otorgados anteriormente. 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 incluidos en la
nueva autorización combinada.
Cuando usas el token de actualización de la autorización combinada para obtener un token de acceso, este representa la autorización combinada y se puede usar para cualquiera de los valores
scope
incluidos en la respuesta.La autorización combinada incluye todos los permisos que el usuario otorgó al proyecto de la API, incluso si se solicitaron otorgamientos a clientes diferentes. Por ejemplo, si un usuario otorgó acceso a un alcance mediante el cliente de escritorio de una aplicación y, luego, otro alcance a la misma aplicación a través de un cliente de dispositivo móvil, la autorización combinada incluiría ambos alcances.
Si revocas un token que representa una autorización combinada, se revoca el acceso a todos los permisos de esa autorización en nombre del usuario asociado de forma simultánea.
Precaución: Si eliges incluir permisos otorgados, se agregarán de forma automática permisos otorgados anteriormente por el usuario a tu solicitud de autorización. Si tu app no está aprobada para solicitar todos los alcances que se pueden mostrar en la respuesta, es posible que aparezca una página de advertencia o error. Consulta Apps sin verificar para obtener más información.
Las muestras de código específicas del lenguaje del Paso 1: Configura parámetros de autorización y la URL de redireccionamiento HTTP/REST de muestra del Paso 2: Redirecciona al servidor OAuth 2.0 de Google usan autorización incremental. En las siguientes muestras de código, también se indica el código que debes agregar para usar la autorización incremental.
Python
$client->setIncludeGrantedScopes(true);
En Python, configura el argumento de palabra clave include_granted_scopes
como true
para asegurarte de que una solicitud de autorización incluya permisos otorgados anteriormente. Es muy posible que include_granted_scopes
no sea el único argumento de palabra clave que configures, como se muestra en el siguiente ejemplo.
Rita
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')
Node.js
auth_client.update!(
:additional_parameters => {"include_granted_scopes" => "true"}
)
HTTP o REST
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
});
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 ya le 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
HTTPquery parameter to
offline
when redirecting the user toGoogle'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.
If your application needs offline access to a Google API, set the API client's access type to
offline
:
$client->setAccessType("offline");
Después de que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las APIs de Google en nombre del usuario cuando este no tiene conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
PythonEn Python, establece 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 permiso al usuario. Es muy posible que access_type
no sea el único argumento de palabra clave que configures, 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')
Después de que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las APIs de Google en nombre del usuario cuando este no tiene conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
RitaSi 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"}
)
Después de que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las APIs de Google en nombre del usuario cuando este no tiene conexión. El objeto de cliente actualizará el token de acceso según sea necesario.
Node.jsSi 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
});
Después de que un usuario otorga acceso sin conexión a los permisos solicitados, puedes seguir usando el cliente de la API para acceder a las APIs de Google en nombre del usuario cuando este no tiene 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 manera 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 token solo ocurre en la primera autorización, y debes establecer tu 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 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, se adquirirán y actualizarán automáticamente los tokens de acceso en la próxima llamada a la API.
Para actualizar un token de acceso, tu 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 muestra el intercambio del 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-urlencodedclient_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 nuevo token de acceso. 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 de cliente/usuario y otro por usuario en todos los clientes. Debes guardar los tokens de actualización
en un almacenamiento a largo plazo y seguir usándolos mientras sigan siendo válidos. Si tu aplicación solicita demasiados tokens de actualización, podría alcanzar estos límites, en cuyo caso los tokens de actualización más antiguos dejarán de funcionar.
En algunos casos, es posible que el usuario desee 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 el documento de asistencia Cómo quitar el acceso a sitios o apps de la sección Sitios y apps de terceros que tienen 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 los que un usuario anula la suscripción, quita una aplicación o los recursos de la API requeridos por una app cambiaron de forma significativa. En otras palabras, parte del proceso de eliminación puede incluir una solicitud a la API para garantizar que se quiten los permisos otorgados anteriormente a la aplicación.
Para revocar un token de manera programática, llama a revokeToken()
:
Python
$client->revokeToken();
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 establezca el encabezado Content-Type
:
Rita
requests.post('https://oauth2.googleapis.com/revoke',
params={'token': credentials.token},
headers = {'content-type': 'application/x-www-form-urlencoded'})
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)
El token puede ser de acceso o de actualización. Si el token es de acceso y tiene un token de actualización correspondiente, también se revocará el token de actualización.
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.
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 el token es de acceso y tiene un token de actualización correspondiente, también se revocará el token de actualización.
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.
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}
El token puede ser de acceso o de actualización. Si el token es de acceso y tiene un token de actualización correspondiente, también se revocará el token de actualización.
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.
... <看更多>
vyond中文 在 Vyond-教學影片製作的7個秘訣–博識通資訊 - YouTube 的推薦與評價
更多數位學習服務就在博識通 博識通資訊 https://www.posboss.com.tw/index.php博識通FB ... ... <看更多>