Аутентификация конечных точек в облаке - PullRequest
0 голосов
/ 14 марта 2019

Я использую App Engine Standard со средой исполнения Python 2 и фреймворками конечных точек.При отправке запроса приложение просто возвращает «Успешно», если запрос был выполнен.Я пытаюсь реализовать аутентификацию, чтобы неаутентифицированные пользователи не смогли выполнить запрос.Я сделал следующее:

  1. Изменен мой декоратор main.py для включения издателей и аудитории:
issuers={'serviceAccount': endpoints.Issuer('[MYSERVICEACCOUNT]', 'https://www.googleapis.com/robot/v1/metadata/x509/[MYSERVICEACCOUNT]')}, 
audiences={'serviceAccount': ['[MYSERVICENAME]-dot-[MYPROJECT].appspot.com']}
Изменен метод main.py для проверки правильности пользователя:
user = endpoints.get_current_user()
if user is None:
   raise endpoints.UnauthorizedException('You must authenticate first.')

Восстановил и заново развернул мой документ openAPI.Теперь в нем есть разделы security и securityDefinitions.

Обновлен мой app.yaml для ссылки на эту версию конечных точек.

Повторно развернуто мое приложение

Чтобы сделать авторизованный запрос к моему приложению, я сделал следующее:

  1. Я назначил служебной учетной записи роль потребителя услуги в моей службе конечных точек.

  2. Создание подписанного jwt с помощью функции generate_jwt из документации Google .Я передаю учетные данные, используя файл ключа json учетной записи службы.

    payload = json.dumps({
        "iat": now,
        "exp": now + 3600,
        "iss": [MYSERVICEACCOUNT],
        "sub": [MYSERVICEACCOUNT],
        "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
    })
Сделайте запрос, используя функцию make_jwt_request из документации Google.
   headers = {
        'Authorization': 'Bearer {}'.format(signed_jwt),
        'content-type': 'application/json'}

Я получаю 401 Ошибка клиента: не авторизован для ошибки URL.Я что-то упустил?

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Есть несколько деталей, которые стоит проверить:

  • Список разрешенных аудиторий должен содержать значение aud утверждения созданного клиентом токена JWT. Это то, на что указала Роуз.
  • Все претензии JWT, представленные в образце клиента Документация присутствуют. В вашем коде отсутствует заявка email в словаре JWT payload.
  • Метод, к которому вы обращаетесь, не требует специальных областей OAuth. Области действия задаются как поле scopes декоратора @endpoints.method.
1 голос
/ 19 марта 2019

Ваша аудитория не совпадает;в вашем коде требуется аудитория [MYSERVICEACCOUNT], но при создании JWT ваша аудитория составляет [MYSERVICENAME]-dot-[MYPROJECT].appspot.com.Они должны соответствовать.

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

После открытия заявки в службу поддержки Google оказывается, что документация Google была неверной. Функция main.py должна проверять подлинность пользователя следующим образом:

providers=[{ 
'issuer': '[YOUR-SERVICE-ACCOUNT]', 
'cert_uri': 'https://www.googleapis.com/service_accounts/v1/metadata/raw/[YOUR-SERVICE-ACCOUNT]', 
}] 

audiences = ['[YOUR-SERVICE-NAME]-dot-[YOUR-PROJECT-NAME].appspot.com'] 

user = endpoints.get_verified_jwt(providers, audiences, request=request) 
if not user: 
  raise endpoints.UnauthorizedException 

После внесения этого изменения при попытке сделать аутентифицированный запрос я получил следующую ошибку:

Обнаружена непредвиденная ошибка при реализации метода ProtoRPC: AttributeError (объект 'unicode' не имеет атрибута 'get')

Это было вызвано тем, как я генерировал полезную нагрузку с помощью json.dumps (). Я сгенерировал без json.dumps (), как показано ниже:

payload = {
  "iat": now,
  "exp": now + 3600,
  "iss": [MYSERVICEACCOUNT],
  "sub": [MYSERVICEACCOUNT],
  "aud": [MYSERVICENAME]-dot-[MYPROJECT].appspot.com
}

Эти два изменения исправили мою проблему.

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