2015-09-10 14 views
7

Abbiamo un'applicazione che si basa su Google per autenticare i suoi utenti contro il nostro account Google Apps e quindi effettuare alcune verifiche server e ricerche di gruppo.L'API di Google+ non restituisce access_token Javascript

Recentemente google ha cambiato il nome dell'oggetto che conteneva la variabile access_token che abbiamo bisogno di autenticare. Nei documenti (https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile) si dice che access_token è disponibile dal metodo getAuthResponse(), tuttavia quando lo uso viene restituito come non definito. Ispezionando l'oggetto dopo console.log() vengono visualizzati tutti gli altri campi menzionati, ad eccezione di access_token. Sono preoccupato che Google cambierà nuovamente l'oggetto in futuro e ci lascerà senza la nostra applicazione. Ecco il codice.

<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()); 
     } 

Qual è il modo corretto di accedere alla variabile access_token?

+0

E 'questo quello stupido di una domanda che nessuno risposte? –

+0

È successo di nuovo ieri sera. L'oggetto grezzo ancora una volta ha cambiato nome e ha rotto le nostre applicazioni. –

risposta

1

Beh, ho un problema di hacking che ottiene l'access_token dalla variabile.

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; 
     } 

Sicuramente questa non può essere la soluzione più elegante. Se qualcuno potesse indicare la direzione più retta sarebbe buona.

4

Se è necessario utilizzare il token di accesso, si utilizza il tipo di flusso di accesso di Google errato. Si dovrebbe seguire questa pagina: https://developers.google.com/identity/sign-in/web/server-side-flow

quello che hai fatto di implementare è Google Accedi per identificare gli utenti (https://developers.google.com/identity/sign-in/web/)

che prevede solo un ID univoco per ogni utente perché è pensato per autenticare l'utente per il proprio servizio e non dare un token di accesso da utilizzare per altri servizi Google in seguito.

4

Credo che il tuo problema sia che alla tua applicazione manca il necessario google-signin-scope.

Per rispondere alla tua domanda ho creato un'app da terra utilizzando lo Google Developer Console. L'applicazione è molto semplice come quella presente in questo tutorial.

L'intera applicazione consiste in un semplice codice HTML che carica l'API di google e ha una richiamata chiamata onSignIn (come la tua).

Ecco il codice entide dell'applicazione:

<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> 

Come si può vedere, la differenza tra la mia app e il vostro è che il vostro manca il primo attributo META.

+0

Beh, questo funziona. Sono solo preoccupato che questo non sia necessariamente corretto come da risposta di base sopra. Lo esaminerò oggi e lo capirò. Grazie –

+0

Il documento api https://developers.google.com/identity/sign-in/web/reference#googleusergetauthresponse specifica che restituisce il token di accesso.La risposta di @Romulo spiega perché il risultato di access_token non è definito. Sono riuscito a riprodurre il problema quando ho intenzionalmente lasciato fuori l'ambito. Penso che questa dovrebbe essere la risposta accettata. – user3240644

0

Ecco il codice per accedere utilizzando 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> 
0

Prova questa var = _access_token GoogleUser.getAuthResponse(). Access_token