OAuth Google API for Javaユーザーを偽装できません
-
11-12-2019 - |
質問
ユーザーを偽装し、サーバープロセスから彼らのGoogleドライブにファイルをGoogle Driveに追加したいと思います。サービスアカウントを設定し、サービスアカウントとしてドライブに正常にアクセスし、ファイルの追加とリストファイルなどを次のコードを使用して実行できます。
/** 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は、次のようにサービスアカウントのユーザーのEメールアドレスを追加することによってユーザーを偽装するためにも使用できます。
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)
.
ステップまたは設定設定がありませんか?
ありがとう、 David
解決
私は私のものと同じような質問を見つけました:
CPanelのドキュメントは、コンシューマキーの有効化を参照してからManage APIクライアントアクセス画面にドメインを追加することを参照しているため、少し誤解があります。これはGDATA APIに有効であり、新しいGoogle Drive APIではなく表示されます。他の問題で提案されているようにクライアントIDを追加し、ドライブスコープへのアクセスを許可することで、私は今ユーザーを偽装できるようになりました。
他のヒント
管理パネルを介してxxxxx.apps.googleusercontent.comにスコープを追加するように管理者に取得します。
スプレッドシートで作業するために次のものを追加しました:
https://www.googleapis.com/auth/drive
https://docs.google.com/feeds
<> href="https://spreadsheets.google.com/feeds" real="nofollow noreferrer"> https://spreadsheets.google.com/feeds