2015-06-30 2 views
0

Я пытаюсь выполнить передачу полномочий между доменами между моей учетной записью службы приложений и моей организацией (на admin.google.com). Я следовал this гидам, примерно три раза, и я не могу знать, где я пропущу, это не сработает. Мое приложение не может выполнять персонализацию пользователя внутри организации.Выполнять полномочия домена для домена Google

Отклик API говорит, что:

Exception in thread "main" com.google.api.client.auth.oauth2.TokenResponseException: 403 Forbidden 
{ 
    "error" : "access_denied", 
    "error_description" : "Requested client not authorized." 
} 
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) 
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287) 
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:268) 
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) 
    at StorageSample.main(StorageSample.java:156) 

Вот мой уникальный код, для теста:

String emailAddress = "[email protected]"; 
      JsonFactory JSON_FACTORY =   JacksonFactory.getDefaultInstance(); 
      HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 

      //scopes 
      List scopes = new ArrayList(); 
      scopes.add(DriveScopes.DRIVE); 
      scopes.add(DriveScopes.DRIVE_APPDATA); 
      scopes.add(DriveScopes.DRIVE_APPS_READONLY); 
      scopes.add(DriveScopes.DRIVE_FILE); 

      GoogleCredential credential = new GoogleCredential.Builder() 
      .setTransport(httpTransport) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(emailAddress) 
      .setServiceAccountPrivateKeyFromP12File(new File("valid_path_to_secrets.p12")) 
      .setServiceAccountScopes(scopes) 
      .setServiceAccountUser("[email protected]") // HERE THE USER I WANT TO PERSONIFICATE 
      .build(); 

      Drive drive = new Drive.Builder(httpTransport, JSON_FACTORY, credential).setApplicationName("Test").build(); 

      String myName = drive.about().get().execute().getName(); 
      com.google.api.services.drive.Drive.Files.List files = drive.files().list(); 
      FileList fileList = files.execute(); 
      List<com.google.api.services.drive.model.File> xFiles = fileList.getItems(); 

      System.out.println("here"); 
      for (com.google.api.services.drive.model.File f : xFiles){ 
       System.out.println("DEBUG "+f.getOriginalFilename()); 
       System.out.println(f.getDownloadUrl()); 
       System.out.println(f.getAlternateLink()); 
       System.out.println(f.getOwnerNames().get(0)); 
       System.out.println(f.getFileSize()); 
      } 
     } 

     } 

Если я комментирую строку, отмеченную (setServiceAccountUser("[email protected]")), приложение работает, но Я хочу сделать персонификацию этого пользователя test. Это намерение данного руководства предоставило, чтобы предоставить доступ всем пользователям внутри mydomain.com.br.

Delegate domain-wide authority to your service account В разделе руководства по Google, как уже упоминалось, я все шаги, с особым вниманием на номер шага 6: Для того, чтобы добавить объем на admin.google.com в разделе Security. (конфигурация администратора Google для приложения) Here ir my google admin configuration for the app

+0

Вы можете добавить скриншот конфигурации, которую вы создали в консоли администратора mydomain.com.br? – David

+0

@ David Да, сэр, вот вы на скриншоте администратора Google! Спасибо за помощь. –

ответ

2

Вы уполномочили идентификатор клиента для сферы 1 Привод:

https://www.googleapis.com/auth/drive 

Эта область находится в Java под постоянным DriveScopes.DRIVE.

Но при создании учетных данных в своем коде вы просите 4 областей:

scopes.add(DriveScopes.DRIVE); 
scopes.add(DriveScopes.DRIVE_APPDATA); 
scopes.add(DriveScopes.DRIVE_APPS_READONLY); 
scopes.add(DriveScopes.DRIVE_FILE); 

Я согласен, что с DriveScopes.DRIVE является сфера, которая включает в себя другие области действия в Drive, казалось бы нормальным, что получение разрешения для DriveScopes.DRIVE подразумевает, что вы получите авторизацию для всех остальных областей накопителя.

Однако это не тот случай, и вы должны указать в разделе Securityвсе области, которые вы планируете использовать. В вашем случае это будет:

https://www.googleapis.com/auth/drive 
https://www.googleapis.com/auth/drive.appdata 
https://www.googleapis.com/auth/drive.apps.readonly 
https://www.googleapis.com/auth/drive.file 

Но поскольку все эти прицелы уже включены в https://www.googleapis.com/auth/drive вы также можете просто удалить другие областей из кода Java. Это то, что я буду делать:

... 
List scopes = new ArrayList(); 
scopes.add(DriveScopes.DRIVE); 
//No other scope 

GoogleCredential credential = new GoogleCredential.Builder() 
... 
+0

Вы правы, сэр. Большое спасибо! Оно работает! –

Смежные вопросы