gmail api watch: клиент не авторизован для получения маркеров доступа с использованием этого метода, или клиент не авторизован для какой-либо из запрошенных областей - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь позвонить Пользователь: смотреть из python облачной функции Google.

Я тестирую скрипт на своем ноутбуке.

Установите, чтобы Я сделал:

  1. включил gmail API в проекте
  2. создал учетную запись службы с json файлом учетных данных
  3. поместил идентификатор клиента учетной записи службы в Управление доступом клиента API со следующими областями API ['https://mail.google.com/','https://www.googleapis.com/auth/admin.directory.user']
  4. проверено, включено ли делегирование G Suite для всего домена

Ошибка, которую я продолжаю получать: err=('unauthorized_client: Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested.', '{\n "error": "unauthorized_client",\n "error_description": "Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested."\n}')

Я попытался передать учетные записи службы и установить userId = TARGET_INBOX, и это просто возвращает неправильный запрос. Я попытался просмотреть другие сообщения SO, связанные с этими ошибками, и не вижу ничего, что я сделал неправильно.

Pipfile:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
pytest = "*"

[packages]
flask = "*"
google-cloud-pubsub = "*"
google-api-python-client = "*"
google-auth = "*"

[requires]
python_version = "3.7"

watch_inboxes.py

import os

import google.auth
from google.auth import impersonated_credentials
from google.auth.exceptions import RefreshError
from googleapiclient.discovery import build
import json

from googleapiclient.errors import HttpError

SCOPES = ['https://mail.google.com/', 'https://www.googleapis.com/auth/admin.directory.user']

TARGET_INBOX = '***TARGET_EMAIL_ADDRESS****'


def watch_inboxes(request):

    if not os.environ['GOOGLE_APPLICATION_CREDENTIALS']:
        exit(-1)

    creds, proj = google.auth.default()

    request = {
        'labelIds': ['INBOX'],
        'topicName': 'projects/***PROJECTNAME***/topics/***TOPICNAME****'
    }

    delegated_credentials = creds.with_subject(TARGET_INBOX)

    org_service = build('gmail', 'v1', credentials=delegated_credentials)
    org_rval = None

    try:
        org_rval = org_service.users().watch(userId='me', body=request).execute()
    except HttpError as err:
        print("err={}, context={}".format(err, err.content))
    except RefreshError as err:
        print("err={}".format(err))

    print("org_rval={}".format(org_rval))

    return org_rval

1 Ответ

2 голосов
/ 14 января 2020

Читая ваш код, кажется, вы забыли добавить scopes к вашей google.auth.default() -функции .

Таким образом, конечный продукт будет выглядеть так google.auth.default(scopes)

...