Двухэтапный протокол OAuth2.0 для Служб Google с XOAUTH2

Я использую API-клиент Google python для создания объекта SignedJwtAssertionCredentials с Service Account, который можно успешно использовать для олицетворения пользователя и доступа к некоторым API, таким как календарь, например:

credentials = SignedJwtAssertionCredentials(CLIENT_ID, PRIVATE_KEY, SCOPE)
http = httplib2.Http()
http = credentials.authorize(http)
service = build('calendar', 'v3', http = http)
...

Я ищу способ использовать эти учетные данные для подключения с использованием IMAP и XOAUTH2, что означает, что мне нужно создать строку XOAUTH2, например:

'user=<EMAIL_ADDR>\1auth=Bearer <ACCESS_TOKEN>\1\1'

При использовании обычного OAuth2 часть ACCESS_TOKEN можно легко обновить и получить. Я пробовал:

credentials = SignedJwtAssertionCredentials(
  CLIENT_ID, PRIVATE_KEY, "https://mail.google.com/",
  prn = "[email protected]")
credentials.refresh(httplib2.Http())

И использовать credentials.access_token в строке XOAUTH2, но это не работает.

Есть ли способ преобразовать SignedJwtAssertionCredentials в строку XOAUTH2?


person Tzach    schedule 01.01.2014    source источник


Ответы (2)


Взгляните на: http://google-mail-oauth2-tools.googlecode.com/svn/trunk/python/oauth2.py

и, в частности, GenerateOAuth2String, который принимает токен доступа (например, тот, который у вас уже есть) и имя пользователя и генерирует правильный формат для XOAUTH2. (Хитрость заключается в том, чтобы не забыть передать False для параметра base64_encode, если вы собираетесь использовать его с imaplib, иначе он будет закодирован дважды.)

Тем не менее, по памяти учетная запись службы не может фактически отправлять/получать электронную почту как сама по себе, но если вы использовали олицетворение домена для олицетворения пользователя в своем домене (что вы упоминаете, но я не вижу в приведенных выше примерах кода ), он должен работать нормально.

person aeijdenberg    schedule 06.01.2014
comment
Спасибо, я обновил код вопроса, чтобы включить олицетворение. Я действительно решил это несколько дней назад. - person Tzach; 09.01.2014

Отвечая на мой собственный вопрос:

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

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

user_email = '[email protected]'
credentials = SignedJwtAssertionCredentials(
    CLIENT_ID, PRIVATE_KEY, "https://mail.google.com/", prn = user_email)
credentials.refresh(httplib2.Http())
xoauth2_string = 'user=%s\1auth=Bearer %s\1\1' % (
    user_email, credentials.access_token)
person Tzach    schedule 09.01.2014