¿Es posible seleccionar correctamente cualquier cuenta de Google disponible para utilizar cuando se utiliza la autorización a través de la biblioteca del cliente JS para Drive?

Tengo una aplicación existente habilitada para Google Drive que usa la biblioteca del cliente de Google Java y la autenticación del flujo del servidor.

Si no ha iniciado sesión en la aplicación y navega hasta la URL Y ha iniciado sesión en más de una cuenta de Google en ese navegador (solo es posible una cuenta personal de Google, las cuentas adicionales deben ser de Google), la callback de OAuth ofrece las opciones para seleccionar qué cuenta de Google usar.

Sin embargo, al probar un cambio al uso de la biblioteca de cliente JavaScript, no puedo activar la pantalla de selección de múltiples cuentas usando gapi.auth.authorize. ¿Es posible manejar múltiples cuentas usando la biblioteca JS?

Actualización: Intenté con el parámetro immediate false . Puedo iniciar sesión siempre que no cambie la cuenta en la ventana emergente. Si cambio la cuenta, consigo:

https://accounts.google.com/o/oauth2/auth?client_id=433863057149.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis. com / auth / drive.install + https: //www.googleapis.com/auth/userinfo.email+https: //www.googleapis.com/auth/userinfo.profile&immediate=false&redirect_uri=postmessage&origin=https: // drivedrawio. appspot.com y proxy = oauth2relay593063763 & response_type = token & state = 701344514 & authuser = 1

en una nueva pestaña y no pasa nada. He hecho un video para demostrar .

Actualización 2: Se ha aceptado esta falla contra la biblioteca del cliente JS por la necesidad de una doble selección de la cuenta multiproceso.

No obtendrá la pantalla de selección de usuario múltiple debido al siguiente parámetro: authuser=0 Esto selecciona automáticamente la primera cuenta con la que authuser=1 ( authuser=1 seleccionaría la segunda, etc.).

Actualmente no es posible eliminar ese parámetro utilizando la biblioteca del cliente porque la biblioteca del cliente lo establece automáticamente en 0 (es por eso que afirma no manejar cuentas múltiples) si no hay ningún valor, así que una forma es anularlo a -1 para ejemplo, esto mostrará el selector de múltiples cuentas. Luego, también puede solicitar el acceso al perfil o correo electrónico del usuario al mismo tiempo que solicita acceso a otras API y obtiene el correo electrónico del usuario o su ID. Luego, en la autenticación posterior, puede especificar el parámetro user_id que omitirá la pantalla de selección de usuario.

Entonces, en la práctica, primero autoriza así:

 gapi.auth.authorize({client_id: , scope: 'https://www.googleapis.com/auth/drive openid', // That requires access to Google Drive and to the UserInfo API authuser: -1}); 

El único problema con lo anterior es que la actualización automática de la biblioteca del cliente no funcionará porque cada autenticación se bloqueará en la pantalla de selección de varias cuentas.

El truco consiste en obtener el ID del usuario que utiliza la API de UserInfo, guardar esa identificación en una cookie de sesión y usarla en una autenticación posterior como esa:

 gapi.auth.authorize({client_id: , scope: 'https://www.googleapis.com/auth/drive openid', user_id: , authuser: -1}); 

Al especificar la ID del usuario, se asegurará de que el selector de múltiples cuentas sea omitido y permita que la actualización automática del token de la lib del cliente vuelva a funcionar.

Como referencia, otros parámetros de URL que afectan el flujo de usuarios son:

  • user_id : similar a authuser (omite la pantalla de selección de múltiples cuentas) pero puede usar la dirección de correo electrónico (p. ej. bob@gmail.com) o la ID de usuario que obtiene de nuestra API de extremo de Open ID Connect / Google + API / UserInfo
  • approval_prompt : el valor predeterminado es auto , puede configurarse para force para asegurarse de que se muestre la pantalla de aprobación / concesión. Esto asegura que la pantalla de Gant no se omite en la autenticación posterior (después de la primera vez).
  • immediate : immediate es un poco complicado, cuando se establece en true omitirá la pantalla de concesión (algo así como approval_prompt=auto ) si el usuario ya otorgó la aprobación previamente, pero si el usuario no ha otorgado la aprobación previamente, se le redirigirá con un error: error=immediate_failed . Si se establece en false , no agregará un comportamiento especial y, por lo tanto, se retrotraerá a la configuración del comportamiento mediante el valor de approval_prompt .

Nota: immediate=true y approval_prompt=force es una combinación inválida.

Creo que la biblioteca del cliente está usando el param immediate para que si obtiene el error=immediate_failed se reinicie un auth flow sin el param de authuser , pero eso son solo especulaciones 🙂

La página de acceso de concesión de OAuth solo se muestra cuando no está en modo inmediato, ¿funciona como se espera si establece el parámetro immediate en falso?

Según http://code.google.com/p/google-api-javascript-client/issues/detail?id=11, el cliente de JavaScript no admite el inicio de sesión múltiple.

Preste atención al parámetro de automonitor . Establezca esto en “2”, por ejemplo, y se le pedirá que inicie sesión, incluso si ya está autenticado.

Intereting Posts