Я хочу получить доступ к электронной таблице на 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 при выполнении последней строки. что-то идет не так с токеном обновления. Кто-нибудь видит, что я делаю неправильно?
Я сделал автономный простое приложение, и теперь я получаю следующие ошибки: 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)
Вы предоставили доступ учетной записи службы к листу? – DaImTo
Спасибо за ваш быстрый ответ. как вы можете предоставить доступ к учетной записи службы? Пользователь с электронной почтой в serviceaccountuser имеет доступ к электронной таблице. Я даже пытался с владельцем диска, но с тем же результатом. Я думаю, что я что-то делаю неправильно или что-то забыл. Когда я отлаживаю поток. я вижу, что после getfeed он войдет в sessionExpiredException и после этого в методе refreshtoken, где появляется nullpointer. Мне нужно установить refreshtoken или что-то еще? – jackiejarvis
возьмите адрес электронной почты учетной записи службы и дайте ему доступ, как и вы, другим пользователем. – DaImTo