2015-09-10 7 views
7

Wir haben eine Anwendung, die darauf beruht, dass Google seine Benutzer gegen unser Google Apps-Konto authentifiziert und dann einige serverseitige Verifizierungs- und Gruppensuchen durchführt.Google+ API gibt kein access_token zurück Javascript

In letzter Zeit hat Google den Namen des Objekts geändert, das die Variable access_token enthielt, die wir zur Authentifizierung benötigen. In der Dokumentation (https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile) heißt es, dass access_token von der getAuthResponse() -Methode zur Verfügung steht, aber wenn ich dieses benutze, kommt es als undefined zurück. Wenn Sie das Objekt nach console.log() untersuchen, werden alle anderen Felder mit Ausnahme von access_token angezeigt. Ich mache mir Sorgen, dass Google das Objekt in Zukunft wieder ändern und uns ohne unsere Bewerbung verlassen wird. Hier ist der Code.

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

Wie ist der korrekte Zugriff auf die Variable access_token?

+0

Ist dies, dass von einer Frage dumm, dass niemand Antworten? –

+0

Gestern Abend wieder passiert. Das rohe Objekt änderte erneut die Namen und brach unsere Anwendungen. –

Antwort

1

Nun, ich habe eine Hack-Arbeit, die das Access_Token von der Variable bekommt.

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

Sicherlich kann dies nicht die eleganteste Lösung sein. Wenn jemand in die richtige Richtung zeigen könnte, wäre das gut.

4

Wenn Sie Zugriffstoken verwenden müssen, verwenden Sie den falschen Typ von google signin flow. Sie sollten dieser Seite folgen: https://developers.google.com/identity/sign-in/web/server-side-flow

Was Sie bei der Implementierung haben ist Google-Anmeldung Benutzer zu identifizieren (https://developers.google.com/identity/sign-in/web/)

, die nur eine eindeutige ID pro Benutzer zur Verfügung stellt, weil es gemeint ist, den Benutzer für die eigenen authentifizieren Service und kein Zugangstoken, das später für andere Google-Dienste verwendet werden kann.

4

Ich glaube, Ihr Problem ist, dass Ihre Anwendung fehlt die notwendige google-signin-scope.

Um Ihre Frage zu beantworten, habe ich eine App aus dem Boden mit der Google Developer Console erstellt. Die Anwendung ist sehr einfach wie die dies tutorial.

Die gesamte Anwendung besteht aus einem einfachen HTML-Code, der die Google API lädt und einen Callback namens onSignIn (wie Ihres) hat.

Hier ist der entide Code der Anwendung:

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

Wie Sie sehen können, ist der Unterschied zwischen meiner app und deinem ist, dass Sie das erste META Attribut fehlen.

+0

Nun, das funktioniert. Ich bin nur besorgt, dass dies nicht unbedingt korrekt ist, wie oben Bas Antwort. Ich werde heute darüber nachdenken und es herausfinden. Danke –

+0

Das API-Dokument https://developers.google.com/identity/sign-in/web/reference#googleusergerauthresponse gibt an, dass es das access_token zurückgibt.Die Antwort von @Romulo erklärt, warum das Ergebnis von access_token nicht definiert ist. Ich habe es geschafft, das Problem zu reproduzieren, als ich den Bereich absichtlich weggelassen habe. Ich denke, das sollte die akzeptierte Antwort sein. – user3240644

0

Hier ist der Code für die Anmeldung mit 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

Versuchen Sie, diese var _access_token = GoogleUser.getAuthResponse(). Access_token

Verwandte Themen