2015-09-10 27 views
7

Mamy aplikację, która opiera się na Google, aby uwierzytelnić użytkowników na naszym koncie Google Apps, a następnie przeprowadzić weryfikację serwerów i wyszukiwanie grup.Interfejs API Google+ nie zwraca pliku dostępowego JavaScript

Niedawno google zmienił nazwę obiektu przechowującego zmienną access_token wymaganą do uwierzytelnienia. W dokumentach (https://developers.google.com/identity/sign-in/web/reference#googleusergetbasicprofile) jest napisane, że access_token jest dostępny z metody getAuthResponse(), jednak gdy go użyję, wróci jako niezdefiniowany. Sprawdzanie obiektu po tym, jak plik console.log() ujawnia wszystkie inne wymienione pola oprócz parametru access_token. Martwię się, że Google zmieni obiekt ponownie w przyszłości i opuści nas bez naszej aplikacji. Oto kod.

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

Jaki jest prawidłowy sposób dostępu do zmiennej access_token?

+0

Czy to, że głupie pytanie, na które nikt nie odpowiedzi? –

+0

Zdarzyło się ponownie ostatniej nocy. Surowy obiekt ponownie zmienił nazwy i przerwał nasze aplikacje. –

Odpowiedz

1

Cóż, mam pracę hack, która pobiera tag access_token ze zmiennej.

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

Z pewnością nie jest to najbardziej eleganckie rozwiązanie. Gdyby ktoś mógł wskazać w kierunku, który byłby lepszy.

4

Jeśli potrzebujesz tokena dostępu, używasz niewłaściwego rodzaju logowania do logowania google. Należy obserwować tą stronę: https://developers.google.com/identity/sign-in/web/server-side-flow

co zrobiłeś wdrożenia jest Google zalogowania się w celu identyfikacji użytkowników (https://developers.google.com/identity/sign-in/web/)

który przewiduje jedynie unikalny identyfikator każdego użytkownika, ponieważ służy do uwierzytelniania użytkownika na własną rękę nie udostępniać tokenu dostępu do innych usług Google w późniejszym czasie.

4

Uważam, że Twoim problemem jest brak wymaganej aplikacji google-signin-scope.

Aby odpowiedzieć na pytanie, utworzyłem aplikację z poziomu podłoża przy użyciu Google Developer Console. Aplikacja jest bardzo prosta, jak ta w tym tutorial.

Cała aplikacja składa się z prostego kodu HTML, który ładuje google API i ma wywołanie zwrotne o nazwie onSignIn (takie jak twoje).

Oto kod entide zgłoszenia:

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

Jak widać, różnica między moją i waszą aplikacji jest to, że brak jest twój pierwszy atrybut META.

+0

To działa. Obawiam się, że nie jest to poprawne, jak na powyższą odpowiedź Bas. Zajmę się tym dzisiaj i zrozumiem. Dzięki –

+0

Dokument api https://developers.google.com/identity/sign-in/web/reference#googleusergetauthresponse określa, że ​​zwraca to hasło access_token.Odpowiedź @Romulo wyjaśnia, dlaczego wynik access_token jest niezdefiniowany. Udało mi się odtworzyć problem, gdy celowo pominąłem zakres. Myślę, że to powinna być akceptowana odpowiedź. – user3240644

0

Oto kod logowania za pomocą 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

Spróbuj var _access_token = GoogleUser.getAuthResponse(). Access_token

Powiązane problemy