Я хотел получить доступ к некоторым службам google api:
И я борюсь с потоком учетной записи службы oauth2 (вы знаете, что один: Google Oauth v2 - описание учетной записи службы. Для импровизации вам необходимо применить "делегирование полномочий домена в домене" в консоли Google Apps, загрузить файл соответствия файла pk12 и активировать api в проекте консоли Google.
В настоящий момент я всегда получаю:
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
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:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at oauthsample.GDriveAPI.<init>(GDriveAPI.java:50)
at oauthsample.GDriveAPI.main(GDriveAPI.java:85)
Вот мой код:
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Set<String> scopes = new HashSet<String>();
scopes.add("https://www.google.com/m8/feeds");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("[email protected]")
.setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12"))
.setServiceAccountScopes(scopes)
.setServiceAccountUser("[email protected]")
.build();
credential.refreshToken();
ContactsService service = new ContactsService("MYAPP");
service.getRequestFactory().setHeader("User-Agent", "MYAPP");
service.setHeader("GData-Version", "3.0");
service.setOAuth2Credentials(credential);
URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
ContactFeed resultFeed = service.getFeed(feedUrl, ContactFeed.class);
Я также сильно исказился через stackoverflow (не могу перечислить все ссылки и проверить ответы и решения). Но на один вопрос никогда не было четко ответили - ни в googles documentaiont, ни на всех столбцах stackoverflow:
Некоторые говорят "да", некоторые говорят "нет". Итак, какая абсолютная правда?
Насколько я понимаю при чтении документов google: учетная запись службы может выдавать себя за пользователей только тогда, когда вы отвечаете за собственный домен, и вам нужно иметь учетную запись google с зарегистрированным доменом. Затем вы можете получить доступ к консоли администратора и предоставить доступ к учетной записи службы.
Спасибо за ваше терпение и за ваше время ответить.
С уважением Matt
Короткий ответ - нет, невозможно выполнить учетную запись службы-учетной записи @gmail.com. Основная причина заключается в том, что хотя поток OAuth учетной записи службы не включает экран авторизации, в конце дня кто-то должен все же сказать: "Я разрешаю этому приложению олицетворять этого пользователя".
В случае домена Google Apps это лицо является администратором домена, который имеет право одобрять приложения для всех пользователей в домене. Для учетной записи @gmail.com нет других полномочий, которые могут одобрить это от вашего имени. И если вам все равно нужно спросить у пользователя о авторизации, им просто разумно использовать регулярный трехсторонний поток OAuth, чтобы пригласить пользователя на авторизацию, получить токен обновления и т.д.
Теперь на некоторое время появилась трюка, в которой вы могли бы взять пользователя @gmail.com через обычный поток с тремя ногами, и после того, как они одобрили его, с этого момента будет использоваться поток учетной записи службы. Однако это приводит к некоторым странным проблемам, поэтому мы отключили этот параметр. Возможно, поэтому в прошлом было несогласие в том, возможно ли это.