2

私は Java に GAE を使用しており、apis を使用して Google ドライブからファイルを読み込もうとしています。DrEdit の標準実装を使用しました。アカウントで認証し、次のスニペットを使用して資格情報を保存するサーブレットがあります。

 protected void handleCallbackIfRequired(HttpServletRequest req,
      HttpServletResponse resp) throws IOException {
    String code = req.getParameter("code");
System.out.println("Code:" + code);

if (code != null) {
  // retrieve new credentials with code
  Credential credential = credentialManager.retrieve(code);

credentialManager.save(id, credential);
System.out.println("access token:" + credential.getAccessToken());
System.out.println("refresh token:" + credential.getRefreshToken());
  resp.sendRedirect("/");
}

}

  public Credential retrieve(String code) {
    System.out.println("Passed code to retrieve is:" + code);
      try {
      GoogleTokenResponse response = new GoogleAuthorizationCodeTokenRequest(
          transport,
          jsonFactory,
          clientSecrets.getWeb().getClientId(),
          clientSecrets.getWeb().getClientSecret(),
          code,
          clientSecrets.getWeb().getRedirectUris().get(0)).execute();

      Credential cred = buildEmpty();
      cred.setRefreshToken(response.getRefreshToken());
      cred.setAccessToken(response.getAccessToken());
      return cred;

    } catch (IOException e) {
      new RuntimeException("An unknown problem occured while retrieving token");
    }
    return null;
  }
}

accessToken と refreshToken を保存するためのコード:

protected void handleCallbackIfRequired(HttpServletRequest req,
      HttpServletResponse resp) throws IOException {
    String code = req.getParameter("code");
    System.out.println("Code:" + code);

    if (code != null) {
      // retrieve new credentials with code
      Credential credential = credentialManager.retrieve(code);

    credentialManager.save(id, credential);
    System.out.println("access token:" + credential.getAccessToken());
    System.out.println("refresh token:" + credential.getRefreshToken());
      resp.sendRedirect("/");
    }
  }

この後、GAE が毎回資格情報を自動的に取得し、ドライブ API を呼び出せるようになることを期待しています。ただし、ログに以下のメッセージが表示されます。だから、なぜそれが起こっているのか分かりません。作成した承認 URL にはオフライン スコープが含まれていることに注意してください。

  "code" : 401,
    "errors" : [ {
    "domain" : "global",
    "location" : "Authorization",
    "locationType" : "header",
    "message" : "Invalid Credentials",
    "reason" : "authError"
    } ],
    "message" : "Invalid Credentials"
    }

新しい再認証を強制した後のログ:

2013-09-08 22:51:28.512
[s~sakshumweb-hrd/3.370083570818804963].<stdout>: Code:4/jYpKc6Mit2_0OTgR7dhpve0YGQCG.UoLMhsf6Fd4SEnp6UAPFm0GoUpACggI

I 2013-09-08 22:51:28.512
[s~sakshumweb-hrd/3.370083570818804963].<stdout>: Passed code to retrieve is:4/jYpKc6Mit2_0OTgR7dhpve0YGQCG.UoLMhsf6Fd4SEnp6UAPFm0GoUpACggI

I 2013-09-08 22:51:29.423
[s~sakshumweb-hrd/3.370083570818804963].<stdout>: access token:ya29.AHES6ZS3x8fPpq5G9YHmIvFHE098izZ0zyn7BCnZRDhYf3zdA-qNDtw

I 2013-09-08 22:51:29.424
[s~sakshumweb-hrd/3.370083570818804963].<stdout>: refresh token:null

I 2013-09-08 22:51:29.450
[s~sakshumweb-hrd/3.370083570818804963].<stdout>: authorization url:https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=auto&client_id=955443778501.apps.googleusercontent.com&redirect_uri=http://www.sakshum.org/GoogleOauth&response_type=code&scope=https://www.googleapis.com/auth/drive.readonly%20https://www.googleapis.com/auth/userinfo.email%20https://www.googleapis.com/auth/userinfo.profile
4

3 に答える 3

0

次の代わりに、retrieve(String code) メソッドで置き換えてみてください。

Credential cred = buildEmpty();
cred.setRefreshToken(response.getRefreshToken());
cred.setAccessToken(response.getAccessToken());
return cred;

と置換する:

Credential cred = buildEmpty();
cred.setFromTokenResponse(response);
return cred;
于 2014-05-16T20:11:04.667 に答える