Облачные функции Google: Как получить токены доступа в облачной функции для требуемого объема? - PullRequest
0 голосов
/ 19 февраля 2019

Мы отклоняемся от механизма хранения данных по расписанию (рекомендуется Google) и принимаем расписание резервного копирования хранилища данных с помощью облачного планировщика , который будет нацелен на HTTP функцию облака .Здесь мы хотим использовать облачную функцию, чтобы экспортировать наши объекты хранилища данных в определенный сегмент памяти.Причина такого отклонения от стандартного механизма заключается в том, что мы хотим избежать дублирования кода, не относящегося к приложениям, во всех наших службах.

Согласно документам , служба управляемого экспорта и импорта доступна только через API администратора режима хранилища данных (REST, RPC), а для запросов требуется авторизация OAuth 2.0.

В облачной функции для доступа к API хранилища данных https://datastore.googleapis.com/v1/projects/<APP ID>:export нам требуется access_token из области действия https://www.googleapis.com/auth/datastore.

В стандартном коде приложения GAE, используя среду выполнения python27, мы можем получить access_token какв следующем примере -

from google.appengine import app_identity

access_token, _ = app_identity.get_access_token('https://www.googleapis.com/auth/datastore')

Но облачные функции имеют время выполнения Python37.Таким образом, импорт google.appengine дает ошибку как error as error: ModuleNotFoundError: No module named 'google.appengine'

Как мы можем получить access_token для требуемой области?(любая из следующих областей) -

Пожалуйста, дайте ссылку на код / ​​документ Python.Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

JWT и токен доступа - это две разные вещи.JWT состоит из трех частей: заголовка, набора заявок и подписи.С другой стороны, токен доступа может быть получен только с Сервера авторизации.Пожалуйста, добавьте раздел этого документа Google.Я создал облачную функцию, передавая данные учетной записи службы для кодирования в JWT (с заголовком и полезной нагрузкой).

signed_jwt = jwt.encode(payload, key, headers=additional_headers, algorithm='RS256')
decoded_signed_jwt = signed_jwt.decode("utf-8")

Чтобы получить токен доступа, обратитесь к следующему фрагменту кода.

token_endpoint = 'https://www.googleapis.com/oauth2/v4/token'
token_req_data = {
    'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    'assertion': decoded_signed_jwt
}
token_post_data = urllib.parse.urlencode(token_req_data).encode("utf-8")

access_token_req = urllib.request.Request(token_endpoint, token_post_data)
access_token_req.add_header('Content-Type', 'application/x-www-form-urlencoded')
result = urllib.request.urlopen(access_token_req)
json_str = result.read()

Эта строка json должна включать токен доступа.Используйте этот токен доступа в заголовке запроса для требуемого API.Обновите свою полезную нагрузку для подписанного JWT, как показано ниже, в противном случае вы не сможете получить действительный JWT.

'scope': 'https://www.googleapis.com/auth/cloud-platform',
'aud': 'https://www.googleapis.com/oauth2/v4/token'

Надеюсь, это поможет, и я благодарен службе поддержки Google за часть этого ответа.

0 голосов
/ 19 февраля 2019

Python 3.4 или выше поддерживается google.appengine.Ошибка высвобождается в google-api-python-client, которая не устанавливается как зависимость при запуске функции.

Попробуйте добавить его в Requeriment.txt на странице редактора Clound Functions.

Вы также можете использовать google-auth от import google.auth

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...