2017-09-05 3 views
0

少なくとも今年6月の終わり(2017)まで(私のユーザーは先生のため、夏の間に私たちのアプリケーションにアクセスしていない...)私は以下の作業フローを持っていました。gapi grantOfflineAccess refresh_tokenへのアクセスコード

ユーザーは、gapiライブラリを使用してWeb経由でログインします。新規ユーザーの場合は、で成功した記号はその後、その後refresh_token用のコード取引所に当社のJavaのバックエンドに送信されたコードを取得するために

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

を呼び出します。 google-api-clientライブラリ(v 1.22.0)を使用して、最初のサインイン時に返されるユーザーのid_tokenを確認し、その後、refresh_tokenを取得するREST呼び出しを返します。

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

は、少なくとも6月までは、REST呼び出しは、リフレッシュトークンがある(とにかく数週間以内に)今、次の形式

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

でJSONオブジェクトを返した...しかし、 REST呼び出しの応答には含まれません。

私たちのサーバーが使用するためにrefresh_tokenを取得するには、何が変更されましたか?明らかに、Googleが提供するOAuth 2.0の遊び場で

私は私のアプリと同じスコープを使用してリフレッシュトークンのための「コード」を交換するとき、私はそう

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

バックオブジェクトを取得し、遊び場は私とは違ったやり方をしています。私は、Chromeデバッガで送信されたリクエストを見てきました。

答えて

0

私はプロンプトであることの追加... ...以下を含めるように

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

をgrantOfflineAccess呼び出しを変更することで、重要なの問題を解決しました。私が知る限り、オフラインアクセスの同意を与えるためのウィンドウは自動的に閉じられていたので、返されたコードはJava側でリフレッシュトークンを生成するのに有効ではありませんでした。

また、REST呼び出しの代わりにGoogleクライアントライブラリを直接使用するようにJavaコードを更新しました(ただし、JSの変更によってREST呼び出しで更新トークンが取得されたため、一貫性が保たれていました)。

GoogleAuthorizationCodeTokenRequest request = 
    new GoogleAuthorizationCodeTokenRequest(new NetHttpTransport(), new JacksonFactory(), 
            clientInfo.getClientId(), clientInfo.getClientSecret(), 
            r.getRefreshCode(), "postmessage"); 
request.setGrantType("authorization_code"); 
GoogleTokenResponse response = request.execute(); 
関連する問題