javascript - one - google plus share url
La API de Google+ no devuelve access_token Javascript (5)
Aquí está el código para iniciar sesión usando google.
<html lang="en">
<head>
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="YOUR_CLIENT_ID.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
</head>
<body>
<div class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div>
<script>
function onSignIn(googleUser) {
// Useful data for your client-side scripts:
var profile = googleUser.getBasicProfile();
console.log("ID: " + profile.getId()); // Don''t send this directly to your server!
console.log("Name: " + profile.getName());
console.log("Image URL: " + profile.getImageUrl());
console.log("Email: " + profile.getEmail());
// The ID token you need to pass to your backend:
var id_token = googleUser.getAuthResponse().id_token;
console.log("ID Token: " + id_token);
};
</script>
</body>
</html>
Tenemos una aplicación que se basa en Google para autenticar a sus usuarios contra nuestra cuenta de aplicaciones de Google y luego hacer algunas verificaciones en el servidor y búsquedas grupales.
Recientemente Google cambió el nombre del objeto que contenía la variable access_token que necesitamos para autenticar. En los documentos ( https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile ) dice que access_token está disponible desde el método getAuthResponse (), sin embargo, cuando lo uso, aparece como indefinido. La inspección del objeto después de console.log () revela todos los demás campos mencionados excepto access_token. Me preocupa que Google vuelva a cambiar el objeto en el futuro y nos deje sin nuestra aplicación. Aquí está el código.
<head>
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
<script src="https://apis.google.com/js/platform.js" async defer></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<meta name="google-signin-client_id" content="XXX.apps.googleusercontent.com">
<script>
//This happens after the user has authenticated with Google and has been passed
//back to the page
function onSignIn(googleUser) {
//Check to see whether the user is trying to sign out.
if (window.location.href.indexOf("signOut=1") !== -1) {
//Sign them out of the application.
signOut();
//redirect them to the same page, without the signOut query string so they can log back in if want
window.location.href=''googlesigninform.html''
return false;
}
//Grab the token, access token and email.
var _id = googleUser.getAuthResponse().id_token; //This works
var _accessToken = googleUser.Ka.access_token; //This works but changed from googleUser.B.access_token
var profile = googleUser.getBasicProfile(); //Works
console.log(googleUser.access_token); //Undefined
console.log(googleUser.getAuthResponse().access_token);//Undefined
//Make a post request to the API
makePostRequest(_id, _accessToken, profile.getEmail());
}
¿Cuál es la forma correcta de acceder a la variable access_token?
Bueno, tengo un truco que obtiene el access_token de la variable.
function findAccessToken(googleUser) {
var returnValue;
Object.getOwnPropertyNames(googleUser).forEach(function (val, idx, array) {
console.log(val + '' -> '' + googleUser[val]);
Object.getOwnPropertyNames(googleUser[val]).forEach(function (vals, idxs, arrays) {
if (vals === "access_token") {
console.log("true");
returnValue = googleUser[val][vals];
}
});
});
return returnValue;
}
Sin duda, esta no puede ser la solución más elegante. Si alguien pudiera apuntar en la dirección correcta, sería bueno.
Creo que su problema es que su aplicación carece del google-signin-scope
.
Para responder a su pregunta, creé una aplicación desde el suelo utilizando Google Developer Console
. La aplicación es muy simple como la de este tutorial
.
La aplicación completa consiste en un código HTML simple que carga la API de Google y tiene una devolución de llamada llamada onSignIn (como la suya).
Aquí está el código de entrada de la aplicación:
<html lang="en">
<head>
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="PLACE_YOUR_ID_HERE.apps.googleusercontent.com">
<script src="https://apis.google.com/js/platform.js" async defer></script>
</head>
<body>
<div class="g-signin2" data-onsuccess="onSignIn" data-theme="dark"></div>
<script>
function onSignIn(googleUser) {
var response = googleUser.getAuthResponse(),
idToken = response[''id_token''],
accessToken = response[''access_token''];
console.dir(''id token: '' + idToken);
console.dir(''access token: '' + accessToken);
}
</script>
</body>
</html>
Como puede ver, la diferencia entre mi aplicación y la suya es que la suya carece del primer atributo META
.
Pruebe esto var _access_token = GoogleUser.getAuthResponse (). Access_token
Si necesita usar un token de acceso, está utilizando el tipo incorrecto de google signin flow. Debe seguir esta página: https://developers.google.com/identity/sign-in/web/server-side-flow
Lo que implementó es el inicio de sesión de Google para identificar a los usuarios ( https://developers.google.com/identity/sign-in/web/ )
Lo cual solo proporciona una identificación única por usuario, ya que está destinado a autenticar al usuario para su propio servicio y no a proporcionar un token de acceso para usarlo posteriormente en otros servicios de Google.