oauth 2.0 - Código de autorización de inicio de Google y autenticación con la cuenta de Google
oauth-2.0 actions-on-google (1)
La forma actual de autenticar a un usuario a través de su cuenta de Google es usar el inicio de sesión de Google para Asistente . Una vez que inicien sesión en su Acción, obtendrá un token de identificación que podrá decodificar para obtener su ID de Google, que podrá utilizar para buscar su cuenta en su almacén de datos para obtener sus tokens de acceso / actualización.
Ya que necesita ámbitos adicionales, si el usuario inicia sesión en el Asistente y aún no tiene los ámbitos adjuntos a su cuenta, los redireccionará a una página de inicio de sesión basada en la web donde pueden iniciar sesión utilizando el inicio de sesión de Google con Alcances que necesitas. En este caso, cuando inicien sesión y autoricen el acceso a través de la web, obtendrás el código de autenticación que necesitarás intercambiar por el token de autenticación y el token de actualización y almacenarlos.
No necesita crear sus propios puntos finales de OAuth para esto, aunque tendrá que hacer un poco de trabajo adicional para asegurarse de que sean redirigidos a su sitio web para hacer la autorización si es necesario.
Solo obtendrá el código de autenticación una vez cuando inicie sesión y lo autorice. Deberá intercambiar esto por los tokens de autenticación y actualización y luego almacenarlos.
Actualización para explicar las cosas un poco mejor.
Mirando la arquitectura, vemos que tiene algunos componentes. Vamos a entrar en los detalles de cada uno de estos a medida que avanzamos por el flujo del proceso:
-
Tiene un almacén de datos de algún tipo, donde almacenará el token de autenticación y el token de actualización para el usuario. Asumiré que está utilizando la ID de usuario de Google como el índice para este almacén de datos.
-
Por "ID de usuario de Google" en este caso, me refiero al identificador numérico único que Google asigna a cada cuenta. Esto a menudo se representa como una cadena, a pesar de tener solo dígitos numéricos, ya que suele ser mucho más largo que la mayoría de los tipos numéricos. En el token de ID, esta es la reclamación "sub".
-
En teoría, podría usar otros identificadores disponibles en las notificaciones en el token de identificación, como su dirección de correo electrónico. Desafortunadamente, no se garantiza que todos estos campos estén disponibles, solo la "sub" está garantizada.
-
-
Tiene un servidor web que tendrá algunas URL importantes para nuestros propósitos:
- El webhook para tu cumplimiento de acción.
- Una página de inicio de sesión / autenticación.
- Un punto final donde el javascript en la página de inicio de sesión le enviará el código de autenticación.
-
El Asistente de Google, que puede estar ejecutándose en una página principal de Google o en un dispositivo móvil. También asumimos que el usuario podrá acceder a un navegador para revisar lo que está autorizando.
-
Los servicios de Google que utilizará, incluido el servicio OAuth de Google.
Comencemos con el caso en el que el usuario ha iniciado sesión anteriormente y nos ha autorizado a acceder al servicio en su nombre. Tenemos su token de autenticación y token de actualización en nuestro almacén de datos, indexados según su ID de usuario de Google. Este es el caso simple, pero nos ayuda a comprender el caso más complicado de cómo todos los datos ingresan allí.
El flujo de datos se ve algo como esto:
- El Asistente envía el Actionhook webhook un Intent y los posibles parámetros con él. Si este es el primer mensaje, es una buena intención, pero no importa. Incluye un token de identidad, que deberemos descodificar y verificar. Como parte de los datos que obtenemos cuando los decodificamos, incluye la ID de usuario para el usuario.
- Usando el ID de usuario ...
- ... obtenemos el token de autenticación y el token de actualización del almacén de datos.
- Con el token de autenticación y el token de actualización, podemos llevar a cabo acciones contra los servicios de Google, actuando en nombre del usuario.
- Obtendremos algunos resultados del servicio ...
- ... que generalmente queremos devolver al usuario de alguna forma.
Fácil, ¿verdad? Pero, ¿qué pasa si el usuario nunca ha usado el Asistente para hablar con nuestra Acción antes? ¿Y nunca nos ha autorizado a acceder a sus servicios de Google, por lo que no tenemos sus tokens? Ese flujo se parece más a esto:
- El Asistente envía la acción webhook un Intento y posibles parámetros. Este será el primer mensaje, por lo que se desencadena nuestra intención de bienvenida. No hay Token de Identidad.
- El webhook ve que no hay un token de identidad, por lo que envía un mensaje solicitando la función de ayuda "Iniciar sesión". Dado que su proyecto está configurado para usar el inicio de sesión de Google, el Asistente le preguntará al usuario si puede proporcionarle la información de su perfil.
- Si dicen que sí, obtendrás otra respuesta que indica que se ha registrado e incluye el token de identidad, que descodificamos, verificamos y obtenemos su ID de usuario. (Si dicen que no, obtendremos una respuesta que dice que falló. Cómo manejarlo es otra historia. Voy a suponer que dicen que sí).
- Usando el ID de usuario ...
- ... intentamos obtener el token de autenticación y el token de actualización del almacén de datos. Pero aún no nos han autorizado. Los hemos autenticado , pero no tenemos autorización ...
- ... por lo que enviamos un mensaje diciendo que necesitan visitar nuestro sitio web para autorizarnos a acceder a sus servicios de Google. Es posible que necesitemos que cambien a un dispositivo móvil para hacer esta parte e incluso que incluyan un enlace a la página de inicio de sesión.
- Seguirán el enlace en un dispositivo que tiene una pantalla.
- Enviaremos de vuelta la página de inicio de sesión, que incluye un enlace para Iniciar sesión con Google. Hemos configurado este botón para solicitar también los ámbitos adicionales que necesitamos para acceder a sus servicios, así como el permiso para acceder a los servicios en su nombre cuando están "fuera de línea".
- Pasarán por el inicio de sesión de Google, la pantalla de ámbitos de OAuth y, con suerte, nos otorgarán todos los permisos que deseemos. (De nuevo, ignoro lo que sucede si no lo hacen). Omito el aspecto de esa danza, ya que no nos involucra. Suponiendo que todo va bien, Google les da un Código de Autentificación, que nos envía el javascript en la página de inicio de sesión.
- Llamamos a los servidores OAuth de Google para verificar el código de autenticación y usarlo para obtener el token de autenticación y el token de actualización ...
- ... que luego almacenamos en el almacén de datos ...
- … Y luego envíe algo para que la página de Javascript pueda decirle al usuario que puede usar nuestra Acción normalmente de ahora en adelante.
Lo que ahora pueden hacer, y se comporta como lo hizo en el escenario anterior, simple.
Eso parece complejo, pero resulta que podemos eliminar algunos pasos en algunos casos. Si Google Cloud Project es el mismo proyecto que usa tanto para su Acción como para el inicio de sesión de Google basado en la web, una vez que autoricen el proyecto en la web, todas las llamadas a su cumplimiento incluirán el token de identidad. Esto nos permite eliminar los pasos 2-6 anteriores, para que las cosas se vean así:
- El Asistente envía la acción webhook un Intento y posibles parámetros. Este será el primer mensaje, por lo que se desencadena nuestra intención de bienvenida. No hay Token de Identidad.
- El webhook ve que no hay un token de identidad, por lo que le enviamos un mensaje diciendo que necesitan visitar nuestro sitio web para autorizarnos a acceder a sus servicios de Google. Es posible que necesitemos que cambien a un dispositivo móvil para hacer esta parte e incluso que incluyan un enlace a la página de inicio de sesión. (Estos son los pasos 2 y 6 colapsados desde arriba).
- Seguirán el enlace en un dispositivo que tiene una pantalla.
- Enviaremos de vuelta la página de inicio de sesión, que incluye un enlace para Iniciar sesión con Google. Hemos configurado este botón para solicitar también los ámbitos adicionales que necesitamos para acceder a sus servicios, así como el permiso para acceder a los servicios en su nombre cuando están "fuera de línea".
- Pasarán por el inicio de sesión de Google, la pantalla de ámbitos de OAuth y, con suerte, nos otorgarán todos los permisos que deseemos. (De nuevo, ignoro lo que sucede si no lo hacen). Omito el aspecto de esa danza, ya que no nos involucra. Suponiendo que todo va bien, Google les da un Código de Autentificación, que nos envía el javascript en la página de inicio de sesión.
- Llamamos a los servidores OAuth de Google para verificar el código de autenticación y usarlo para obtener el token de autenticación y el token de actualización ...
- ... que luego almacenamos en el almacén de datos ...
- … Y luego envíe algo para que la página de Javascript pueda decirle al usuario que puede usar nuestra Acción normalmente de ahora en adelante.
También vale la pena señalar que si visitan el sitio web incluso antes de probar la versión del Asistente (es decir, debido a un resultado de búsqueda o lo que sea que comiencen en el paso 8 del segundo diagrama o 4 de ese tercer diagrama) e inicien sesión, entonces obtendrán su Token de Identidad la primera vez que nos visiten a través del Asistente, y esto funcionará igual que en el escenario simple.
Actualmente estoy intentando autenticar una cuenta de Google con una acción de inicio de Google y recuperar el código de autorización de las credenciales. No quiero el token de acceso, sino el código de autorización .
He visto esta publicación y descubrí que Google ha actualizado su política y ya no permite que se utilicen sus propios puntos finales de OAuth para la cuenta que vincula el flujo de código de autorización:
Al implementar la vinculación de cuentas utilizando OAuth, debe poseer su punto final de OAuth
Habiendo dicho eso,
- ¿Cuál es la forma correcta de autenticar a un usuario existente de Google con mi Acción y los ámbitos necesarios? (Necesito acceso al calendario)
- ¿Es posible realizar esta autenticación sin tener que crear mis propios puntos finales OAuth2.0?
- Y a partir de este flujo, ¿es posible extraer el código de autorización ?