Невозможно аутентифицировать учетные записи служб с помощью AppAssertionCredentials в App Engine для службы Gmail.

Я пытаюсь создать службу Gmail, которая будет читать электронные письма пользователей, как только их ИТ-администратор аутентифицирует приложение на рынке приложений. Судя по документации, сервисные учетные записи подойдут, для чего я попробовал оба варианта:

    scope = "https://www.googleapis.com/auth/gmail.readonly"
    project_number = "c****io"
    authorization_token, _ = app_identity.get_access_token(scope)
    logging.info("Using token %s to represent identity %s",
                 authorization_token, app_identity.get_service_account_name())
    #authorization_token = "OAuth code pasted from playground"
    response = urlfetch.fetch(
        "https://www.googleapis.com/gmail/v1/users/me/messages",
        method=urlfetch.GET,
        headers = {"Content-Type": "application/json",
                   "Authorization": "OAuth " + authorization_token})

и

    credentials = AppAssertionCredentials(scope=scope)
    http = credentials.authorize(httplib2.Http(memcache))
    service = build(serviceName='gmail', version='v1', http=http)
    listReply = gmail_service.users().messages().list(userId='me', q = '').execute()

Затем я запустил dev_appserver.py согласно Не удалось получить доступ к BigQuery с локального сервера разработки App Engine

Однако я получаю код ошибки HTTP 500 «Backend Error». Тот же код, но когда я вставляю access_token из игровой площадки OAuth, он работает нормально (HTTP 200). Я на своей локальной машине, если это имеет значение. Интересно, я что-то пропустил? Я пытаюсь найти все электронные письма для всех пользователей определенного домена, где их ИТ-администратор установил мое приложение Google Marketplace.

Спасибо за помощь!


person Debnath Sinha    schedule 21.07.2014    source источник


Ответы (1)


Чтобы выполнить этот тип олицетворения, вы должны создать JWT и указать в поле «sub» адрес электронной почты пользователя, к почтовому ящику которого вы хотите получить доступ. Документация для разработчиков: Использование OAuth 2.0 для межсерверных приложений: дополнительные претензии.

Код Python для создания учетных данных будет выглядеть примерно так

credentials = SignedJwtAssertionCredentials(
    "<service account email>@developer.gserviceaccount.com",
    file("secret-privatekey.pem", "rb").read(),
    scope=["https://www.googleapis.com/auth/gmail.readonly"],
    sub="<user to impersonate>@your-domain.com"
)
person Brandon Jewett-Hall    schedule 22.07.2014
comment
Спасибо! Итак, в контексте приложения Google Apps Marketplace (которое мы создаем), это должно работать для любого домена, в котором установлено приложение? Кроме того, я заметил, что вы можете создать несколько учетных записей служб... будет ли это работать для любой из комбинаций (SERVICE_ACCOUNT_EMAIL, private_key.p12)? Я спрашиваю, потому что во многих документах по широкой аутентификации домена говорится об AdminConsole: Управление доступом стороннего клиента OAuth, но не о приложении Marketplace. И когда я устанавливаю приложение в своем домене с помощью потока тестовой установки, клиентский доступ API показывает имя приложения, а не адрес электронной почты учетной записи службы. - person Debnath Sinha; 24.07.2014