onsuccess onsignin googleuser google getname getbasicprofile example data auth2 google-api google-drive-sdk google-api-client

google-api - onsignin - googleuser getbasicprofile() getname()



GoogleUser.getAuthResponse() no contiene access_token (2)

ACTUALIZACIÓN2: volví a visitar este tema y resolví el problema siguiendo cuidadosamente el doco vinculado a continuación. Pero primero, para aquellos que están luchando con esto, estás en buena compañía. ¡Hay tantas versiones del doco de Google que es confuso! ¿Incluyes platform.js o client.js en tu html? ¿Cargas gapi.auth o gapi.auth2? Utiliza gapi.auth2.render o gapi.auth.authorize, o gapi.auth2.init, y así sucesivamente.

La forma en que se devuelve un access_token (a partir de esta fecha de artículo) se vincula a continuación. Logré hacer que esto funcionara siguiendo cuidadosamente la guía y la referencia usando platform.js. Otras bibliotecas se cargan dinámicamente como client.js utilizando gapi.load (''drive'', callback).

https://developers.google.com/identity/sign-in/web/listeners https://developers.google.com/identity/sign-in/web/reference

==== PROBLEMA ORIGINAL PARA LA PROSPERIDAD ====

ACTUALIZACIÓN 1: He actualizado el ejemplo de código para hacer una búsqueda recursiva del objeto googleUser. Al menos esto no debería romperse en una biblioteca posterior.

Debajo hay un fragmento de código para manejar un problema donde access_token en el objeto Google gapi.auth2.AuthResponse no está en el nivel superior ... está oculto :( en las profundidades del objeto.

¿Entonces es recuperable, pero no en el nivel superior? Me di cuenta de que parece ser un problema de tiempo ... una vez que la aplicación se ejecuta por un tiempo en las comprobaciones posteriores, sí contiene el token de acceso en el nivel superior.

var authResponse = _.googleUser.getAuthResponse(); _.id_token = authResponse.id_token; // Always exists // access_token should also be a param of authResponse if (authResponse.access_token) { debug("Worked this time?"); _.access_token = authResponse.access_token; } else { // !!! Internal object access !!! debug("Attempt to get access token from base object."); _.access_token = _.objRecursiveSearch("access_token", _.googleUser); if (_.access_token) { debug("Access token wasn''t on authResponse but was on the base object, WTF?"); } else { debug("Unable to retrieve access token."); return false; } } _.objRecursiveSearch = function(_for, _in) { var r; for (var p in _in) { if (p === _for) { return _in[p]; } if (typeof _in[p] === ''object'') { if ((r = _.objRecursiveSearch(_for, _in[p])) !== null) { return r; } } } return null; }

Supongo que getAuthResponse de alguna manera proporciona una devolución de llamada una vez que está lista, pero no puedo ver en qué parte de la API. https://developers.google.com/identity/sign-in/web/reference


Descubierto la solución para esto. Resulta que si no proporcionamos la configuración del alcance de inicio de sesión en gapi.auth2.init , no se devuelve access_token en getAuthResponse . Por favor, llame a gapi.auth2.init como se indica a continuación y access_token estará presente.

gapi.auth2.init({ client_id: <googleClientID>, ''scope'': ''https://www.googleapis.com/auth/plus.login'' })


Sé que esta pregunta es bastante antigua, pero aparece primero cuando busco en Google ".getAuthResponse () no tiene access_token," que es como llegué aquí.

Entonces para aquellos de ustedes en 2016 (y tal vez más tarde) esto es lo que he descubierto

Hay un argumento secreto sobre .getAuthResponse , no documentado en ningún lugar que haya encontrado. Si ejecutara lo siguiente en su aplicación

console.log(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse);

Verás que obtienes lo siguiente (copiar / pegar desde mi consola)

función (a) {si (a) devuelve this.hg; a = .HE; var c = .rf (this.hg) ;! a.Ph || a.dL || a.Lg || (eliminar c. access_token, delete c.scope); return c}

Esto muestra que la función .getAuthResponse() busca un argumento y, por lo que puedo ver, ni siquiera comprueba su valor; simplemente comprueba si está allí y luego devuelve el objeto completo. Sin esa función, el resto del código se ejecuta y podemos ver muy claramente que está borrando dos claves: access_token y scope .

Ahora, si llamamos a esta función con y sin el argumento, podemos verificar la diferencia en el resultado. (nota: utilicé JSON.stringify porque tratar de copiar / pegar el objeto desde la consola de mi navegador me causaba algunos problemas).

console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse())); console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse(true)));

Objeto getAuthResponse ()

{"token_type": "Portador", "login_hint": " <Huge mess of letters> ", "expires_in": 2112, "id_token": " <insert your ridiculously long string here> ", ...}

Objeto getAuthResponse (true)

{"token_type": "Portador", "access_token": " <an actual access token goes here> ", "scope": " <whatever scopes you have authorized> ", "login_hint": " <another mess of letters> " , "expires_in": 2112, "id_token": " <Insert your ridiculously long string here> ", ...}

Espero que esto les ayude chicos!