OAuth Google-API für Java nicht in der Lage, die Identität von Benutzer

Ich würde gerne einen Benutzer zu imitieren und Dateien hinzufügen, um die Benutzer von Google Drive auf Ihren Namen von einem server-Prozess. Ich habe setup ein service-Konto und kann erfolgreich auf das Laufwerk zugreifen, da der service-Konto hinzufügen und auflisten von Dateien, etc. mit dem folgenden code:

  /** 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("[email protected]")
                  .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();
  }

Dieser Werke jedoch gibt nur Dateien, die verbunden sind, was ich annehme, ist im Zusammenhang mit der Dienst-Konten-Laufwerk (?).

Entsprechend der JavaDoc, GoogleCredential kann auch verwendet werden, um die Identität eines Benutzers durch hinzufügen der service-Konto-Benutzer E-Mail-Adresse wie folgt:

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("[email protected]")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("[email protected]") //<-- impersonate user a
                  .build();

Jedoch, wenn dieser code ausgeführt, wird die folgende Ausnahme ausgelöst:

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)

Bin ich fehlt ein Schritt-oder Konfigurationseinstellung?

Dank,
David

  • Wie hast du gewähren, dass service-Konto zugreifen, um die Identität von Benutzern, die auf Ihre domain? Wussten Sie, fügen Sie die client-ID und das entsprechende Bereiche in der OAuth-Abschnitt der Google Apps control panel? - support.google.com/a/bin/answer.py?hl=en&Antwort=162106
  • Ja, das war das fehlende Stück, danke für die Antwort, die ich fand meine Antwort aus einer ähnlichen Frage.
InformationsquelleAutor David | 2012-07-26
Schreibe einen Kommentar