2017-06-07 6 views
3

Ich habe eine Java-Anwendung erstellt, die die Synchronisierung von MS Active Directory mit Google Groups durchführt. Es ist eine nicht-interaktive Anwendung, die von dem Cronjob in der Nacht ausgeführt werden soll. Es funktioniert perfekt auf meinem Laptop (DEV-Umgebung). Mein Problem ist, dass beim ersten Start erscheint das Browser-Fenster mit dem Dialogfeld fragt den Zugriff auf die Google API zu autorisieren. Nachdem ich auf "Erlauben" geklickt habe, geht es fröhlich zum Ende. Jetzt muss ich es auf den Produktionsserver verschieben, auf dem CentOS läuft und keinen Browser hat. Wenn ich meine Anwendung in dieser Umgebung ausgeführt druckt es die folgende Meldung:Nicht interaktive Autorisierung mit Google OAuth2

Please open the following address in your browser: 
https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=520105804541-c7d7bfki88qr8dbkv6oahp22i3oq1jq0.apps.googleusercontent.com&redirect_uri=http://localhost:50089/Callback&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.group.member%20https://www.googleapis.com/auth/admin.directory.orgunit%20https://www.googleapis.com/auth/admin.directory.device.mobile.action%20https://www.googleapis.com/auth/admin.directory.orgunit.readonly%20https://www.googleapis.com/auth/admin.directory.userschema%20https://www.googleapis.com/auth/admin.directory.device.chromeos%20https://www.googleapis.com/auth/admin.directory.notifications%20https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly%20https://www.googleapis.com/auth/admin.directory.device.mobile%20https://www.googleapis.com/auth/admin.directory.group.readonly%20https://www.googleapis.com/auth/admin.directory.group.member.readonly%20https://www.googleapis.com/auth/admin.directory.userschema.readonly%20https://www.googleapis.com/auth/admin.directory.user.alias%20https://www.googleapis.com/auth/admin.directory.user.security%20https://www.googleapis.com/auth/admin.directory.device.mobile.readonly%20https://www.googleapis.com/auth/admin.directory.user%20https://www.googleapis.com/auth/admin.directory.user.readonly%20https://www.googleapis.com/auth/admin.directory.user.alias.readonly%20https://www.googleapis.com/auth/admin.directory.group%20https://www.googleapis.com/auth/apps.groups.settings 

Es gibt keinen Browser auf dieser Maschine, aber wenn ich versuche, es auf einem anderen Feld zu laufen ich Störung erhalte 400 - ungültige Anforderung. Der Grund ist klar, weil es auf localhost: 50089 umleitet und niemand auf diesem Port auf einem anderen Rechner zuhört. Wenn Sie die verschiedenen Dokumente und Beispiele auf developers.google.com durchgehen, habe ich eine Möglichkeit gefunden, den Dialog zu umgehen, indem Sie das Dienstkonto erstellen und einen Primärschlüssel dafür generieren.

try { 
     GoogleCredential cr = GoogleCredential 
      .fromStream(new FileInputStream(keyFile)) 
      .createScoped(SCOPES); 
     Directory directory = new Directory.Builder(httpTransport, jsonFactory, cr) 
.setApplicationName(config.getProperty("google.application.name")).build(); 
    } catch (IOException ex) { 
     LOG.error("Failed to establish access credentials : ", ex.getMessage()); 
    } 

es den Schlüssel gelesen hat und Directory-Instanz nicht erstellen, aber jede Anforderung führt dies zu 403 Antwortcode

{ "Code": 403, "Fehler": [{ "domain" : "global", "message": "Nicht berechtigt, auf diese Ressource/api zuzugreifen", "Grund": "verboten"
}], "Nachricht": "Nicht berechtigt, auf diese Ressource/API zuzugreifen"} "

Aber ich habe al delegiert l Die Berechtigungen für dieses Konto für das Dienstkonto. Ich weiß nicht, was ich noch tun kann. Wenn mir jemand aus diesem Stau helfen kann, schätze ich es sehr.

Antwort

3

Ich fand Lösung. Das Problem besteht darin, dass der von Google generierte JSON-Schlüssel den Dienstkontobenutzer nicht festlegt. Sie müssen es manuell so machen:

 GoogleCredential cr = GoogleCredential 
      .fromStream(new FileInputStream(keyFile)) 
      .createScoped(SCOPES); 
     GoogleCredential.Builder builder = new GoogleCredential.Builder() 
      .setTransport(httpTransport) 
      .setJsonFactory(jsonFactory) 
      .setServiceAccountScopes(SCOPES) 
      .setServiceAccountId(cr.getServiceAccountId()) 
      .setServiceAccountPrivateKey(cr.getServiceAccountPrivateKey()) 
      .setServiceAccountPrivateKeyId(cr.getServiceAccountPrivateKeyId()) 
      .setTokenServerEncodedUrl(cr.getTokenServerEncodedUrl()) 
      .setServiceAccountUser(user); 
     Directory directory = new Directory.Builder(
       httpTransport, jsonFactory, builder.build()) 
      .setApplicationName(config.getProperty("google.application.name")).build(); 
+0

Sie sind ein Lebensretter! Google-Dokumentation saugt, und dies ist das einzige Beispiel, das gerade funktioniert hat. – Alex

Verwandte Themen