2017-09-05 3 views
0

Bis mindestens Ende Juni dieses Jahres (2017) (meine Benutzer sind Lehrer, also nicht im Sommer auf unsere Apps zugreifen ...) Ich hatte den folgenden Workflow.gapi grantOfflineAccess access_code to refresh_token

Benutzer würden sich über das Web mit der Bibliothek gapi anmelden. Für neue Benutzer erfolgreich anmelden nennen würde dann

gapi.auth2.getAuthInstance().currentUser.get().grantOfflineAccess() 

einen Code zu erhalten, die dann in unserem Java-Backend den Code für ein refresh_token den Austausch gesendet wurde. Wir verwenden die Google-API-Client-Bibliothek (v 1.22.0), um das id_token des Benutzers zu überprüfen, das bei der ersten Anmeldung zurückgegeben wird, und anschließend einen REST-Aufruf, um das refresh_token zurückzugeben.

HttpClient client = new DefaultHttpClient(); 
HttpPost post  = new HttpPost("https://www.googleapis.com/oauth2/v4/token"); 
List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
pairs.add(new BasicNameValuePair("code", r.getRefreshCode())); 
pairs.add(new BasicNameValuePair("redirect_uri", "postmessage")); 
pairs.add(new BasicNameValuePair("client_id", clientInfo.getClientId())); 
pairs.add(new BasicNameValuePair("client_secret", clientInfo.getClientSecret())); 
pairs.add(new BasicNameValuePair("grant_type", "authorization_code")); 
post.setEntity(new UrlEncodedFormEntity(pairs)); 
org.apache.http.HttpResponse response = client.execute(post); 
String responseBody = EntityUtils.toString(response.getEntity()); 

Bis mindestens Juni kehrte der REST-Aufruf ein JSON-Objekt in der folgenden Form

{ 
    access_token: '', 
    token_type: '', 
    expires_in: 3600, 
    id_token: '', 
    refresh_token: '' 
} 

... Aber jetzt (innerhalb der letzten paar Wochen sowieso), die Refresh-Token nicht in der Antwort vom REST-Aufruf enthalten.

Was hat sich geändert, oder was muss ich anders machen, um das refresh_token für unsere Server zu verwenden?

Im OAuth 2.0 Spielplatz von Google zur Verfügung gestellt, wenn ich die gleichen Bereiche wie meine Anwendung verwenden und tauschen Sie den „Code“ für ein Aktualisierungs-Token, erhalte ich ein Objekt zurück mit

{ 
    "access_token": "", 
    "token_type": "", 
    "expires_in": 3600, 
    "refresh_token": "" 
} 

Also, natürlich dem Playground macht etwas anderes als ich. Ich habe mir die Anfrage im Chrome-Debugger angesehen und sie sieht ähnlich aus wie ich.

Antwort

0

gelöst ich das Problem, indem der Anruf grantOfflineAccess Modifizieren, schließen Folgendes ein ...

gapi.auth2.getAuthInstance().currentUser.get().grantOfflineAccess({ 
    access_type: 'offline', 
    prompt:  'consent', 
    scope:  SCOPES.join(' ') 
}) 

... Wichtig ist die Aufforderung hinzuzufügen. Soweit ich das beurteilen kann, wurde das Fenster zum Einholen der Zustimmung für den Offline-Zugriff automatisch geschlossen, so dass der zurückgegebene Code nicht gültig war, um ein Aktualisierungstoken auf der Java-Seite zu erzeugen.

Außerdem habe ich den Java-Code so aktualisiert, dass die Google-Clientbibliothek direkt anstelle eines REST-Aufrufs verwendet wurde (obwohl die JS-Änderung immer noch zum Abrufen eines Aktualisierungstokens mit dem REST-Aufruf führte).

GoogleAuthorizationCodeTokenRequest request = 
    new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), 
            clientInfo.getClientId(), clientInfo.getClientSecret(), 
            r.getRefreshCode(), "postmessage"); 
request.setGrantType("authorization_code"); 
GoogleTokenResponse response = request.execute(); 
Verwandte Themen