CognitoIdentityCredentials не авторизован для доступа к этому ресурсу - PullRequest
0 голосов
/ 31 мая 2018

Я следил за https://serverless -stack.com / chapters / create-a-cognito-user-pool.html этим руководством, чтобы создать приложение реакции, которое подключается к аутентифицированному API.Все это работает нормально, за исключением аутентификации через API.Я настроил пул пользователей Cognito, пул удостоверений и идентификатор клиента.Я могу войти через приложение, но получаю сообщение об ошибке ниже:

CognitoIdentityCredentials не авторизован для доступа к этому ресурсу

MyКонфигурация для API:

Policies:
        - PolicyName: 'CognitoAuthorizedPolicy'
            PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: 'Allow'
                Action:
                  - 'mobileanalytics:PutEvents'
                  - 'cognito-sync:*'
                  - 'cognito-identity:*'
                    Resource: '*'

              # Allow users to invoke our API
              - Effect: 'Allow'
                Action:
                  - 'execute-api:Invoke'
                Resource:
                  Fn::Join:
                    - ''
                    -
                      - 'arn:aws:execute-api:'
                      - Ref: AWS::Region
                      - ':'
                      - Ref: AWS::AccountId
                      - ':'
                      - Ref: ApiGatewayRestApi
                      - '/*'

Я не уверен, что еще мне нужно добавить в мой serverless.yml.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 01 июня 2018

Я видел ваш вопрос на бессерверных форумах и добавил туда ответ, дублирую его здесь.

Я думаю, что проблема в том, что разрешения API-шлюза execute-api более сложны, чем это.Они имеют форму arn:aws:execute-api:region:account-id:api-id/stage-name/HTTP-VERB/resource-path, и в прошлый раз, когда я пробовал что-то подобное, подстановочного знака сразу после части api-id было недостаточно.Так что вы, вероятно, хотите что-то вроде

Fn::Join:
  - ''
  -
    - 'arn:aws:execute-api:'
    - Ref: AWS::Region
    - ':'
    - Ref: AWS::AccountId
    - ':'
    - Ref: ApiGatewayRestApi
    - '/'
    - ${self:provider.stage} (or wherever you get your serverless stage variable from)
    - '/'
    - '*'
    - '/'
    - '*'

Не цитируйте меня по этому поводу, но я также думаю, что если ваш resource-path также имеет / в нем, то вам нужно получить разрешение, чтобы оноимеет тот же номер /, что и ваш ресурс.Таким образом, если ваш API имеет GET и POST для / x / y / z, то выражение политики должно выглядеть как arn:aws:execute-api:region:account-id:api-id/stage-name/*/*/*/*.Я смутно помню, что мне нужно было иметь права, например

arn:aws:execute-api:region:account-id:api-id/stage-name/*/*
arn:aws:execute-api:region:account-id:api-id/stage-name/*/*/*
arn:aws:execute-api:region:account-id:api-id/stage-name/*/*/*/*
etc

, чтобы соответствовать уровням всех моих ресурсов.Я могу ошибаться, хотя, так что YMMV

См .: https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-apigateway https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-iam-policy-examples-for-api-execution.html

...