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.