2016-08-02 1 views
2

Для того чтобы программа java могла получить доступ к моему приводу Google, мне нужно создать oauth2.Credential, используя файл учетных данных json (см. https://console.developers.google.com) для получения токена доступа.Получить авторизацию от браузера java от браузера браузера за запросом уже предоставленного разрешения

Credentials with client id

Проблема заключается в том, когда я создаю CREDENTIAL экземпляру Java программы Java с открытым Internet Explorer и попросить разрешения на диск.

Credential credential = new AuthorizationCodeInstalledApp(flow 
       , new LocalServerReceiver()) 
       .authorize("user") 
       ; 

Program automatically opens browser and ask permission

Если я нажимаю кнопку "Разрешить", Credential создается, и я получаю жетон.

System.out.println("token" + credential.getAccessToken()); 

Browser after clicked on Allow

Java console view in Eclipse : token get

Проблема заключается в том, что эта ява программа будет пакетная программа, поэтому мы не можем попросить партии нажать на кнопку.

Кроме того, в https://security.google.com/settings/security/permissions?pli=1 мой привод уже получил доступ к моему заявлению (имя приложения GoogleTest) ...

application already granted

Вы знаете, как получить данные без ява программы открытого браузера для спросясь ? Спасибо

Вот полный код:

public static void getToken() { 
    HttpTransport httpTransport ; 
    InputStream inputStream;  
    try { 
     httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     List<String> scope = Arrays.asList(DriveScopes.DRIVE); 
     inputStream = new FileInputStream("C:/dev/ws/mainAzure/GoogleTest/res/client_secret_jcb_inst.json"); 
     InputStreamReader reader = new InputStreamReader(inputStream); 
     clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,reader);        
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport 
      , JSON_FACTORY 
      ,clientSecrets 
      , scope) 
      .setAccessType("offline") 
      .setApprovalPrompt("force") 
      .build();     

     //Browser open when there is new AuthorizationCodeInstalledApp(...) 
     Credential credential = new AuthorizationCodeInstalledApp(flow 
      , new LocalServerReceiver()) 
      .authorize("user") 
      ; 
    System.out.println("token" + credential.getAccessToken()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

ответ

2

После некоторой помощи (спасибо, Гарольд) я мог найти решение: Нужно определить datastorefactory, в другом месте refreshToken не хранится в файле, а Google через интернет-браузер запрашивает разрешение каждый раз. Поэтому я добавил:

dataStoreFactory = new FileDataStoreFactory(new File("C:/dev/ws/mainAzure/GoogleTest/res")); 

и:

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
      httpTransport 
      , JSON_FACTORY 
      ,clientSecrets 
      , scope) 
      .setAccessType("offline") 
      .setApprovalPrompt("force") 
      .build(); 

стали:

  flow = new GoogleAuthorizationCodeFlow.Builder(
       httpTransport 
       , JSON_FACTORY 
       ,clientSecrets 
       , scope)      
       .setAccessType("offline") 
       .setDataStoreFactory(dataStoreFactory) 
       .setApprovalPrompt("force")     
       .build(); 

Кроме того, чтобы иметь доступ не ограничен до 1 часа, одно необходимо обновить маркер:

credential.refreshToken() ; 
1

Это разрешение кода потока для вас. Вы можете повторно использовать те же учетные данные, если вы обращаетесь к одной и той же учетной записи Google.

Рассмотрите возможность получения кода доступа вручную с помощью токенов обновления и вручную вводите его в пакетный код.

+0

Спасибо за ваш ответ, но Цель состоит в том, чтобы иметь доступ к данным из Google Drive без ручного вмешательства, вводя токена доступа. Я ищу решение для этого. Считаете ли вы, что невозможно получить токен автоматически? –

+0

Посмотрите вложенный поток приложений для Google Api.я думаю, что это то, что вам нужно –

+3

Операция должна выполняться только один раз при установке программы, после того, как токен обновления будет сохранен, его снова не будет запрашивать, пакет будет использовать токен обновления, чтобы снова получить новый токен доступа и еще раз. – Harold

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