Проблема с проверкой токена доступа JWT в облачной функции Python - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь добавить авторизацию к моим облачным функциям python. Я создал служебную учетную запись в проекте GCP и сгенерировал ключи. Тестовый клиентский код (не в GCP) для вызова функции Cloud выглядит следующим образом:

from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession

SERVICE_ACCOUNT_FILE = '<my_project_key_file>.json'

credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, 
scopes=['https://www.googleapis.com/auth/userinfo.email'])
authed_session = AuthorizedSession(credentials)
response = authed_session.get('https://<my_project>.cloudfunctions.net/authValidation')

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

from google.oauth2 import id_token
from google.auth.transport import requests

def hello_world(request):

    #  from https://developers.google.com/identity/sign-in/web/backend-auth#using-a-google-api-client-library    
    idinfo = id_token.verify_oauth2_token(request.headers.get('Authorization')[7:]), requests.Request())

Я знаю, что токен ID верен, потому что ручная проверка (с использованием https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxx) возвращает именно то, что я ожидал.

Трассировка стека регистрации ошибок, которую я получаю:

Traceback (most recent call last):
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 346, in run_http_function
    result = _function_handler.invoke_user_function(flask.request)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 217, in invoke_user_function
    return call_user_function(request_or_event)
  File "/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py", line 210, in call_user_function
    return self._user_function(request_or_event)
  File "/user_code/main.py", line 17, in hello_world
    idinfo = id_token.verify_oauth2_token(request.headers.get('Authorization')[7:], requests.Request())
  File "/env/local/lib/python3.7/site-packages/google/oauth2/id_token.py", line 141, in verify_oauth2_token
    certs_url=_GOOGLE_OAUTH2_CERTS_URL)
  File "/env/local/lib/python3.7/site-packages/google/oauth2/id_token.py", line 122, in verify_token
    return jwt.decode(id_token, certs=certs, audience=audience)
  File "/env/local/lib/python3.7/site-packages/google/auth/jwt.py", line 219, in decode
    header, payload, signed_section, signature = _unverified_decode(token)
  File "/env/local/lib/python3.7/site-packages/google/auth/jwt.py", line 139, in _unverified_decode
    header = _decode_jwt_segment(encoded_header)
  File "/env/local/lib/python3.7/site-packages/google/auth/jwt.py", line 112, in _decode_jwt_segment
    six.raise_from(new_exc, caught_exc)
  File "<string>", line 3, in raise_from
ValueError: Can't parse segment: b'\xc9\xad\xbd'

Что мне здесь не хватает? Спасибо

1 Ответ

0 голосов
/ 20 апреля 2019

Установив переменную среды GOOGLE_APPLICATION_CREDENTIOAL в вашей локальной системе, ваш клиент будет работать в контексте этой учетной записи службы, не беспокоясь об авторизации. Вам не нужно кодировать путь к ключевому файлу.

Также относится к развертыванию облачной функции и ее локальному тестированию. При развертывании облачной функции она запускается как учетная запись службы AppEngine по умолчанию или учетная запись службы, указанная в параметре --service-account: https://cloud.google.com/sdk/gcloud/reference/functions/deploy

Ссылка: https://cloud.google.com/docs/authentication/production

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

...