9

ユーザーになりすまして、サーバー プロセスから代わりにユーザーの Google ドライブにファイルを追加したいと考えています。サービス アカウントをセットアップし、サービス アカウントとしてドライブに正常にアクセスして、次のコードを使用してファイルの追加と一覧表示などを行うことができます。

  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  public static void main(String[] args) {
    try {
        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .build();
        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();         
        drive.files().list().execute();
  } catch (Exception e) {
     e.printStackTrace();
  }

これは機能しますが、サービス アカウント ドライブ (?) に関連付けられていると思われるものに関連付けられているファイルのみを返します。

JavaDoc によると、次のようにサービス アカウント ユーザーのメール アドレスを追加することで、GoogleCredential を使用してユーザーを偽装することもできます。

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("usera@domain.com") //<-- impersonate user a
                  .build();

ただし、このコードを実行すると、次の例外がスローされます。

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "access_denied"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:508)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:260)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:796)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:198)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071)

ステップまたは構成設定がありませんか?

ありがとう、デビッド

4

2 に答える 2

6

私と同様の質問を見つけました: Google Apps 管理者は Drive SDK でユーザー ファイルを管理できますか? 私の答えを理解するのに役立ちました。

cPanel のドキュメントは、コンシューマー キーを有効にしてからドメインを Manage API クライアント アクセス画面に追加することについて言及しているため、少し誤解を招きます。これは、新しい Google ドライブ API ではなく、gdata API に対して有効であるようです。他の質問で提案されているようにクライアント ID を追加し、ドライブ スコープへのアクセスを許可することで、ユーザーになりすますことができるようになりました。

于 2012-07-26T01:18:01.790 に答える