Пользовательский авторизатор AWS API Gateway странно показывает ошибку

Вот контекст:

  • Я настроил ресурс в шлюзе API. /пользователь/компания
  • Этот ресурс имеет 2 метода. Получить и отправить.
  • Я настроил пользовательский авторизатор для этого ресурса.

Эта проблема:

  • Я могу вызвать метод GET, отправив правильную информацию об авторизации, и я получу ожидаемые результаты.
  • Я пытаюсь отправить POST-запрос и получаю следующую ошибку:

{
  "message": "User is not authorized to access this resource"
}

  • Если я подожду несколько минут, а затем вызову метод POST, он сработает.
  • Если после вызова метода POST и получения результатов я вызову метод GET, он покажет ту же ошибку, что и упомянутая выше.

Кроме того, я отключил кеш для авторизатора.

введите описание изображения здесь

Что могло вызвать эту проблему?


person Arman Fatahi    schedule 14.05.2018    source источник
comment
сможете ли вы распечатать входные данные в Custom Authorizer (jwtRsaCustomAuthorizer) и проверить, отличаются ли эти входные данные между успешными и неудачными запросами GET/POST. Также не могли бы вы подтвердить, что ваш пользовательский авторизатор не имеет состояния (т. е. реализация хранит некоторые значения в качестве переменных времени выполнения, и логика авторизации зависит от этих переменных времени выполнения)?   -  person Denis Weerasiri    schedule 15.05.2018
comment
Спасибо за информацию, в моем пользовательском авторизаторе я создал политику для POST или GET. Когда я сначала вызываю любой из них, политика создается и по какой-то причине кэшируется. Сброс занял бы несколько минут, и я мог бы вызвать другой метод. Это произошло, несмотря на то, что кеш отключен. Я попытался сгенерировать политику для всего шлюза API при каждом обращении к ресурсу, и это очень хорошо решило проблему.   -  person Arman Fatahi    schedule 15.05.2018
comment
Похоже, политика кэшируется для токена. Во время тестирования я обычно создаю новый токен для каждого запроса.   -  person Kashyap    schedule 04.06.2018
comment
Вы повторно развернули свой API после отключения кэширования?   -  person DaBozUK    schedule 03.07.2018
comment
@DaBozUK Я вообще не активировал кеширование. У меня была работа, чтобы выдавать политику как для POST, так и для GET каждый раз, когда я генерирую политику.   -  person Arman Fatahi    schedule 04.07.2018
comment
Я получаю ту же ошибку. Но в моем случае я предоставил CloudWatchLogs доступ к той роли, которая назначена лямбде. Так что, возможно, у вас есть какая-то другая ошибка разрешения или может быть такая же ошибка разрешения, что и у меня.   -  person utsav    schedule 11.10.2018
comment
СПАСАТЕЛЬНЫЙ ВОПРОС ????????   -  person ken    schedule 07.06.2021


Ответы (5)


Это можно исправить двумя способами, которые описаны в ответе на ошибку: https://forum.serverless.com/t/rest-api-with-custom-authorizer-how-are-you-dealing-with-authorization-and-policy-cache/3310

Укороченная версия:

  1. Установите TTL для авторизатора клиента на 0
  2. Установите настраиваемый ресурс политики авторизатора как *

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

person Orest    schedule 01.11.2018
comment
установка TTL на 0 сделала свое дело. если кто-то использует cf или sam, используйте свойство ReauthorizeEvery в шаблоне. - person astroanu; 01.07.2020
comment
Это помогает, но что, если вам нужно кэширование? - person roccolocko; 12.10.2020

Эта ошибка возникает, если вы используете event.methodArn в качестве ресурса для сгенерированной политики и совместно используете авторизатор между различными функциями из-за того, как работает кэширование политики. Для предоставленного токена политика кэшируется для всего API, это будет одна и та же запись кэша для всех методов и ресурсов в рамках одного и того же API и этапа (если они используют один и тот же авторизатор).

Например, при запросе к GET /users ARN будет выглядеть примерно так:

arn:aws:execute-api:us-1:abc:123/prod/GET/users

При следующем вызове любой конечной точки с тем же маркером аутентификации будет использоваться кэшированная политика, созданная при первом вызове GET /users. Проблема с этой кэшированной политикой заключается в том, что ее ресурс разрешает только один конкретный ресурс arn: ... /prod/GET/users, любой другой ресурс будет отклонен.

В зависимости от того, насколько вы хотите ограничить разрешения политики, вы можете указать каждый возможный ресурс при создании политики.

{
  "principalId": "user",
  "policyDocument": {
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": [
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/POST/v1/users",
          "arn:aws:execute-api:us-1:abc:123/prod/GET/v1/orders"
        ]
      }
    ],
    "Version": "2012-10-17"
  }
}

или используйте подстановочные знаки

"Resource": "arn:aws:execute-api:us-1:abc:123/prod/*/v?/*"

или даже

"Resource": "*"

Вы можете использовать переменные политики для некоторых расширенных шаблонов.

Также можно использовать подход черного списка, разрешая все с помощью подстановочных знаков, а затем запрещая определенные ресурсы в другом заявлении политики.

Источники:

person Michael Radionov    schedule 13.05.2019
comment
Я думаю, что это должен быть лучший ответ. Установите для TTL значение 0 (отключить кеширование), чтобы авторизаторы вызывались всякий раз, когда вызывались ваши конечные точки. Вероятно, это не то, чего хотят разработчики. - person Lolo.; 19.04.2021
comment
ООООММММГГГГ... ТЫ НАСТОЯЩИЙ СПАСАТЕЛЬ ЖИЗНИ ???????? Большое спасибо - person ken; 07.06.2021

В коде сборки пользовательской политики модуль js узла aws-auth-policy Часть Nodejs, которую вы можете использовать,

AuthPolicy.prototype.allowAllMethods = function () {
  addMethod.call(this, "allow", "*", "*", null);
}

В коде

const AuthPolicy = require('aws-auth-policy');
  const policy = new AuthPolicy(principalId, awsAccountId, apiOptions);
           // policy.allowMethod(method, resource);
            policy.allowAllMethods();
            const authResponse = policy.build();
person Subrata Fouzdar    schedule 20.03.2019

Я исправил это, установив AuthorizerResultTtlInSeconds на 0.

Причина этого в том, что я использовал общий авторизатор. Однако авторизатор работал, читая контекст события запроса и предоставляя IAM для последующего вызова определенной лямбды.

Поскольку авторизатор был общим, он кэшировал ответ, который представлял собой IAM для определенной лямбды для TTL (в моем случае) 300 секунд.

Поэтому я мог вызывать один API в одну минуту, а в следующую — нет.

Изменение значения выше на 0 устранило проблему.

person Remotec    schedule 01.09.2019

Я столкнулся с тем же «Пользователь не имеет права доступа к этому ресурсу», моя ошибка заключалась в том, что я не предоставил области OAuth в авторизаторе моего шлюза API.

person Himanshi    schedule 30.10.2020