2015-07-08 3 views
0

Я хочу получить доступ к электронной таблице на Google Диске, используя API java Google для электронных таблиц. В прошлом я использовал метод входа в систему для входа в систему, но этот метод устарел. Теперь я пытаюсь использовать учетную запись службы для получения подлинности без взаимодействия с пользователем, потому что инструмент работает в фоновом режиме, я должен быть автоматизирован. Но я не могу заставить его работать. Этот мой код сейчас.Google Spreadsheet с учетной записью службы

List<String> SCOPES_ARRAY = Arrays.asList(
      "https://www.googleapis.com/auth/drive.file", 
      "https://www.googleapis.com/auth/userinfo.email", 
      "https://www.googleapis.com/auth/userinfo.profile", 
      "https://docs.google.com/feeds", 
      "https://spreadsheets.google.com/feeds"); 
    credential = new GoogleCredential.Builder() 
       .setTransport(transport) 
       .setJsonFactory(jsonFactory) 
       .setServiceAccountId(
         "[email protected]") 
       .setServiceAccountScopes(SCOPES_ARRAY) 
       .setServiceAccountPrivateKeyFromP12File(p12) 
       .setServiceAccountUser("[email protected]") 
       .build(); 
    service = new SpreadsheetService("MonitorV3"); 
    service.setOAuth2Credentials(credential); 

    SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full"); 

    worksheetFeed = service.getFeed(spreadsheet.getWorksheetFeedUrl(), 
        WorksheetFeed.class); 

Но я получаю исключение nullpointer при выполнении последней строки. что-то идет не так с токеном обновления. Кто-нибудь видит, что я делаю неправильно? enter image description here

Я сделал автономный простое приложение, и теперь я получаю следующие ошибки: detailded

Exception in thread "main" com.google.gdata.util.AuthenticationException: Failed to refresh access token: 401 Unauthorized 
at com.google.gdata.client.GoogleAuthTokenFactory$OAuth2Token.refreshToken(GoogleAuthTokenFactory.java:260) 
at com.google.gdata.client.GoogleAuthTokenFactory.handleSessionExpiredException(GoogleAuthTokenFactory.java:702) 
at com.google.gdata.client.GoogleService.handleSessionExpiredException(GoogleService.java:738) 
at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:649) 
at com.google.gdata.client.Service.getFeed(Service.java:1017) 
at JavaApplication20.printDocuments(JavaApplication20.java:50) 
at main.main(main.java:35) 
+0

Вы предоставили доступ учетной записи службы к листу? – DaImTo

+0

Спасибо за ваш быстрый ответ. как вы можете предоставить доступ к учетной записи службы? Пользователь с электронной почтой в serviceaccountuser имеет доступ к электронной таблице. Я даже пытался с владельцем диска, но с тем же результатом. Я думаю, что я что-то делаю неправильно или что-то забыл. Когда я отлаживаю поток. я вижу, что после getfeed он войдет в sessionExpiredException и после этого в методе refreshtoken, где появляется nullpointer. Мне нужно установить refreshtoken или что-то еще? – jackiejarvis

+0

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

ответ

3

Я установил это, используя следующий код:

credential = new GoogleCredential.Builder() 
      .setTransport(transport) 
      .setJsonFactory(jsonFactory) 
      .setServiceAccountId("[email protected]account.com") 
      .setServiceAccountPrivateKeyFromP12File(p12) 
      .setServiceAccountScopes(SCOPES_ARRAY).build(); 
      credential.refreshToken(); 

Так что без .setServiceAccountUser ("я @ gmail.com "). Теперь он работает без ошибок.

+0

Когда я пытаюсь получить доступ к листу, он просит меня запросить доступ. Как предоставить разрешения пользователям? –

+0

@BiscuitCoder попробуйте поделиться листом (из пользовательского интерфейса профайлов Google) на адрес электронной почты учетной записи службы. – sefnap

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