1

ユーザーの Google ドライブ アカウントからいくつかのファイルをダウンロードする必要がある Java ベースのデスクトップ アプリケーションを開発しています。Google ドライブ SDK のドキュメントを調べたところ、次のコードを思いつきました。

public class Main
{
  public static void main(String[] args)
  {
    String clientId = "...";
    String clientSecret = "...";

    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport, 
      jsonFactory,
      clientId,
      clientSecret,
      Arrays.asList(DriveScopes.DRIVE)
    )
      .setAccessType("online")
      .setApprovalPrompt("auto").build();

    String redirectUri = "urn:ietf:wg:oauth:2.0:oob";     
    String url = 
      flow
        .newAuthorizationUrl()
        .setRedirectUri(redirectUri)
        .build();

    System.out.println("Please open the following URL in your browser then type the authorization code:");
    System.out.println("  " + url);
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String code = br.readLine();

    GoogleTokenResponse response = 
      flow
        .newTokenRequest(code)
        .setRedirectUri(redirectUri)
        .execute();

    GoogleCredential credential = 
      new GoogleCredential()
        .setFromTokenResponse(response);

    Drive service = 
      new Drive.Builder(httpTransport, jsonFactory, credential)
        .build();

    ...
  }
}

これは機能しますが、毎回ユーザーがアプリケーションを承認する (つまり、指定された URL をブラウザーで開き、承認トークンをコピーする) 必要があります。初めてアプリケーションを実行するときのみ、ユーザーがアプリケーションを承認する必要があるような方法でアプリケーションを実装する必要があります。次に、アプリケーションは、次回使用するために、ある種のシークレット トークンをローカルに保存します。

ドキュメントを徹底的に調べましたが、この目標を達成する方法についての十分な説明が見つかりませんでした (特にデスクトップ アプリケーションで)。

それ、どうやったら出来るの?

4

2 に答える 2

3

ステップ 1: オフライン アクセス タイプを使用して URL を生成する

flow = new GoogleAuthorizationCodeFlow.Builder(
httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE))
.setAccessType("offline")
.setApprovalPrompt("auto").build();
String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();

ステップ 2: クレデンシャル accessToken と refreshToken を保存します。code = 上記の URL の応答コード

GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
                .build()
                .setFromTokenResponse(response);
String accessToken = credential.getAccessToken();
String refreshToken = credential.getRefreshToken();

ステップ 3: 必要に応じてトークンを再利用する

GoogleCredential credential1 = new GoogleCredential.Builder().setJsonFactory(jsonFactory)
     .setTransport(httpTransport).setClientSecrets(CLIENT_ID, CLIENT_SECRET).build();
credential1.setAccessToken(accessToken);
credential1.setRefreshToken(refreshToken);
Drive service = new Drive.Builder(httpTransport, jsonFactory, credential1).build();

ステップ 4: OAuth を理解してエラーを処理し、トークンを更新する

于 2014-12-09T09:07:09.803 に答える
0

http://javadoc.google-api-java-client.googlecode.com/hg/1.7.0-beta/jdiff/Google%20API%20Client%20Library%20for%20Java%201.7.0-beta/com/google _ /api/client/googleapis/auth/oauth2/GoogleAuthorizationCodeFlow.html accessType = "offline" についてお読みください。これにより、探している保存可能な「シークレット トークン」であるリフレッシュ トークンが返されます。これを保存すると、ユーザーの介入なしで認証トークンに変換できます。

于 2013-09-14T15:11:06.427 に答える