Google está descartando el antiguo botón de inicio de sesión en favor del nuevo . Tengo una miniaplicación de una sola página en la que el servidor solo devuelve contenido de página estático. La página requiere que el usuario inicie sesión y maneja el token devuelto en el lado del cliente. El botón antiguo manejó el caso de la recarga de la página bastante bien, llamando a la devolución de llamada con el nuevo token de inmediato. Sin embargo, el nuevo botón no parece manejar la recarga de la página. Al usar la API de JavaScript con HTML como:
<div id="parent" /> <script> function initGoogleSignIn() { google.accounts.id.initialize({ client_id: 'YOUR_GOOGLE_CLIENT_ID', auto_select: true, callback: onSignIn, }); google.accounts.id.renderButton(document.getElementById('parent'),{}); } function onSignIn(payload) { let unverifiedResponsePayload = JSON.parse(atob(payload.credential.split('.')[1])); //this is just an example - instead you should _verify_ the token before any actual use console.log(unverifiedResponsePayload.email); } </script> <script src="https://accounts.google.com/gsi/client" onload="initGoogleSignIn()"></script>
De acuerdo con la documentación , configurar auto_select en verdadero debería causar que "un token de ID [...] se devuelva automáticamente sin ninguna interacción del usuario cuando solo hay una sesión de Google que haya aprobado su aplicación antes". Sin embargo, iniciar sesión y luego recargar la página no llama a la devolución de llamada. El botón antiguo llama a la devolución de llamada en una configuración similar.
La pregunta es cómo lograr el antiguo comportamiento de obtener el token sin la interacción del usuario en la recarga de la página con el nuevo botón.
Lo que descubrí es que uno puede configurar "One Tap", lo que haría que se llamara a la devolución de llamada en la recarga de la página, pero solo después de mostrar el bloque One Tap y varios segundos de retraso. Todavía me pregunto si este es un comportamiento intencionado que simplemente no está debidamente documentado o si el documento es correcto y Google debe corregir el comportamiento en la biblioteca.
Así es como se puede cambiar la función initGoogleSignIn para usar One Tap:
function initGoogleSignIn() { google.accounts.id.initialize({ client_id: 'YOUR_GOOGLE_CLIENT_ID', auto_select: true, callback: onSignIn, prompt_parent_id: 'parent', //DOM ID of the container element for One Tap block }); google.accounts.id.prompt((notification) => { if (notification.isNotDisplayed() || notification.isSkippedMoment() || (notification.isDismissedMoment() && notification.getDismissedReason() != 'credential_returned')) { // no sign-in happened, display the button google.accounts.id.renderButton(document.getElementById('parent'),{}); } }); }
Este enfoque aún agrega un retraso notable (> 4 segundos en mi caso) para que se llame a la devolución de llamada. El botón antiguo hizo esto mucho más rápido y sin ninguna representación visual.