Google oauth2 олицетворяет учетную запись службы с [email protected]

2

Я хотел получить доступ к некоторым службам google api:

  • API GDrive
  • Contact API
  • 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:

  • Действительно ли вы можете выдавать себя за учетную запись с обычным пользователем [email protected](я имею в виду обычную учетную запись gmail без доступа к указанной консоли администратора в главе "Делегирование полномочий домена на весь сервис учетной записи", а у вас есть собственный домен)

Некоторые говорят "да", некоторые говорят "нет". Итак, какая абсолютная правда?

Насколько я понимаю при чтении документов google: учетная запись службы может выдавать себя за пользователей только тогда, когда вы отвечаете за собственный домен, и вам нужно иметь учетную запись google с зарегистрированным доменом. Затем вы можете получить доступ к консоли администратора и предоставить доступ к учетной записи службы.

Спасибо за ваше терпение и за ваше время ответить.

С уважением Matt

  • 0
    Реально ли выдать себя за сервисную учетную запись? сомневаюсь, что это может вернуться, когда у нас был логин клиента. Я никогда не заставлял его работать с Oauth. Я впечатлен, что вы смогли смешать API Discovery и API GDATA, что не так просто :)
  • 0
    В качестве дальнейшего ввода я могу только сказать, что приведенный выше код представляет собой смесь множества решений типа «попытка и ошибка» и «переполнение стека». Где мой код разрывается в строке "credential.refreshToken ();" Так что я не могу получить новый токен для авторизации. И да, вы правы, это смесь gdata и discovery apis ... но это не главное. Вы можете создать любой сервис, который вам нужен (People API, Gdrive API, ...), если у вас нет правильной и действующей настройки учетных данных oauth.
Показать ещё 2 комментария
Теги:
account
service
google-oauth
impersonation

1 ответ

2
Лучший ответ

Короткий ответ - нет, невозможно выполнить учетную запись службы-учетной записи @gmail.com. Основная причина заключается в том, что хотя поток OAuth учетной записи службы не включает экран авторизации, в конце дня кто-то должен все же сказать: "Я разрешаю этому приложению олицетворять этого пользователя".

В случае домена Google Apps это лицо является администратором домена, который имеет право одобрять приложения для всех пользователей в домене. Для учетной записи @gmail.com нет других полномочий, которые могут одобрить это от вашего имени. И если вам все равно нужно спросить у пользователя о авторизации, им просто разумно использовать регулярный трехсторонний поток OAuth, чтобы пригласить пользователя на авторизацию, получить токен обновления и т.д.

Теперь на некоторое время появилась трюка, в которой вы могли бы взять пользователя @gmail.com через обычный поток с тремя ногами, и после того, как они одобрили его, с этого момента будет использоваться поток учетной записи службы. Однако это приводит к некоторым странным проблемам, поэтому мы отключили этот параметр. Возможно, поэтому в прошлом было несогласие в том, возможно ли это.

  • 2
    Привет, Эрик. Спасибо за разъяснения. Может ли Google обновить документы OAuth следующим предложением: «Невозможно выдать себя за служебную учетную запись только с учетной записью Gmail и без регистрации домена в Google».? Я не хочу использовать ваш упомянутый трюк (угнанный 3-хногой OAuth). Это зло

Ещё вопросы

Сообщество Overcoder
Наверх
Меню