El tipo de vinculación OAuth admite dos flujos de OAuth 2.0 estándares de la industria: el flujo implícito y flujos de código de autorización.
In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.
In the authorization code flow, you need two endpoints:
- The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
- The token exchange endpoint, which is responsible for two types of exchanges:
- Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
- Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.
Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.
Implementa la vinculación de cuentas de OAuth
Configura el proyecto
Si deseas configurar tu proyecto para usar la vinculación de cuentas de OAuth, sigue estos pasos:
- Abre la Consola de Actions y selecciona el proyecto que deseas usar.
- Haz clic en la pestaña Desarrollar y elige Vinculación de cuentas.
- Habilita el interruptor junto a Vinculación de cuentas.
- En la sección Creación de la cuenta, selecciona No, solo quiero permitir la creación de cuentas en mi sitio web.
En Tipo de vinculación, selecciona OAuth e Implícito.
En Client Information, haz lo siguiente:
- Asigna un valor al ID de cliente emitido por tus acciones a Google para identificarlo. solicitudes provenientes de Google.
- Inserta las URLs para los extremos de autorización y intercambio de tokens.
- Haz clic en Guardar.
Implementa tu servidor de OAuth
Para admitir el flujo implícito de OAuth 2.0, tu servicio hace una autorización de destino disponible a través de HTTPS. Este extremo es responsable de autenticar y obtener el consentimiento de los usuarios para acceder a los datos. El extremo de autorización presenta una IU de acceso a los usuarios que aún no accedieron y registra el acceso solicitado.
Cuando tu acción necesita llamar a una de las APIs autorizadas de tu servicio, Google usa este extremo para obtener permiso de los usuarios para llamar a estas APIs en sus nombre.
Una sesión típica de flujo implícito de OAuth 2.0 que inicia Google tiene la siguiente flujo:
- Google abre el extremo de autorización en el navegador del usuario. El el usuario accede a la cuenta si aún no lo ha hecho y le concede a Google permiso para acceder sus datos con tu API si aún no han otorgado permiso.
- Tu servicio crea un token de acceso y lo devuelve a Google redireccionando el navegador del usuario de vuelta a Google con el token de acceso que se adjuntan a la solicitud.
- Google llama a las APIs de tu servicio y adjunta el token de acceso con cada solicitud. Tu servicio verifica que el token de acceso otorgue a Google autorización para acceder a la API y, luego, completa la llamada a la API.
Maneja solicitudes de autorización
Cuando tu acción necesite vincular cuentas mediante un flujo implícito de OAuth2, Google envía al usuario a tu extremo de autorización con una solicitud que incluye los siguientes parámetros:
| Parámetros del extremo de autorización | |
|---|---|
client_id |
El ID de cliente que le asignaste a Google |
redirect_uri |
La URL a la que envías la respuesta a esta solicitud. |
state |
Un valor de contabilidad que se devuelve a Google sin modificar en el URI de redireccionamiento. |
response_type |
Es el tipo de valor que se debe mostrar en la respuesta. Para el OAuth 2.0 implícito
el tipo de respuesta siempre es token. |
Por ejemplo, si tu extremo de autorización está disponible en https://myservice.example.com/auth,
una solicitud podría verse así:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token
Para que tu extremo de autorización controle las solicitudes de acceso, sigue estos pasos:
Verifica los valores
client_idyredirect_uripara evita que se otorgue acceso a apps cliente no deseadas o configuradas incorrectamente:- Confirma que
client_idcoincida con el ID de cliente que asignados a Google. - Confirma que la URL especificada por
redirect_uritiene la siguiente forma: YOUR_PROJECT_ID es el ID que se encuentra en la página Configuración del proyecto de la Consola de Actions.https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
- Confirma que
Verifica si el usuario accedió a tu servicio. Si el usuario no está firmado completa el flujo de acceso o registro del servicio.
Genera un token de acceso que Google usará para acceder a tu API. El el token de acceso puede ser cualquier valor de cadena, pero debe representar de forma única usuario y cliente para el que es el token y no se debe poder adivinar.
Envía una respuesta HTTP que redirecciona el navegador del usuario a la URL especificadas por el parámetro
redirect_uri. Incluye todos los siguientes parámetros en el fragmento de URL:access_token: Es el token de acceso que acabas de generar.token_type: Es la cadenabearer.state: Es el valor del estado sin modificar del original. solicitud El siguiente es un ejemplo de la URL resultante:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING
El controlador de redireccionamiento de OAuth 2.0 de Google recibirá el token de acceso y confirmará
que el valor de state no haya cambiado. Después de que Google obtiene una
token de acceso para tu servicio, Google adjuntará el token a las llamadas posteriores
a tu acción como parte de AppRequest.
Inicia el flujo de autenticación
Usa el intent del asistente para el acceso a la cuenta para iniciar el flujo de autenticación. Los siguientes fragmentos de código describen cómo envía una respuesta en Dialogflow y el SDK de Actions para usar este asistente.
Dialogflow:
const {dialogflow, SignIn} = require('actions-on-google'); const app = dialogflow({ // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT clientId: CLIENT_ID, }); // Intent that starts the account linking flow. app.intent('Start Signin', (conv) => { conv.ask(new SignIn('To get your account details')); });
@ForIntent("Start Signin") public ActionResponse text(ActionRequest request) { ResponseBuilder rb = getResponseBuilder(request); return rb.add(new SignIn().setContext("To get your account details")).build(); }
{ "payload": { "google": { "expectUserResponse": true, "richResponse": { "items": [ { "simpleResponse": { "textToSpeech": "PLACEHOLDER" } } ] }, "userStorage": "{\"data\":{}}", "systemIntent": { "intent": "actions.intent.SIGN_IN", "data": { "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec", "optContext": "To get your account details" } } } }, "outputContexts": [ { "name": "/contexts/_actions_on_google", "lifespanCount": 99, "parameters": { "data": "{}" } } ] }
SDK de Actions:
const {actionssdk, SignIn} = require('actions-on-google'); const app = actionssdk({ // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT clientId: CLIENT_ID, }); // Intent that starts the account linking flow. app.intent('actions.intent.TEXT', (conv) => { conv.ask(new SignIn('To get your account details')); });
@ForIntent("actions.intent.TEXT") public ActionResponse text(ActionRequest request) { ResponseBuilder rb = getResponseBuilder(request); return rb.add(new SignIn().setContext("To get your account details")).build(); }
{ "expectUserResponse": true, "expectedInputs": [ { "inputPrompt": { "richInitialPrompt": { "items": [ { "simpleResponse": { "textToSpeech": "PLACEHOLDER" } } ] } }, "possibleIntents": [ { "intent": "actions.intent.SIGN_IN", "inputValueData": { "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec", "optContext": "To get your account details" } } ] } ], "conversationToken": "{\"data\":{}}", "userStorage": "{\"data\":{}}" }
Maneja solicitudes de acceso a los datos
Si la solicitud del Asistente contiene un token de acceso, Primero, verifica que el token de acceso sea válido (y no haya vencido) y, luego, recupera la cuenta de usuario asociada de tu base de datos.