CognitoIdentityCredentials无权访问此资源

时间:2018-05-31 12:56:41

标签: lambda serverless-framework

我一直在关注https://serverless-stack.com/chapters/create-a-cognito-user-pool.html本教程,以创建一个连接到经过身份验证的API的反应应用。除了通过API进行身份验证之外,所有这些都正常工作。我已经设置了Cognito用户池,身份池和客户端ID。我可以通过应用程序登录,但我一直收到以下错误:

  

CognitoIdentityCredentials无权访问此资源

我的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 :(得分:1)

我在无服务器论坛上看到了你的问题,并在那里添加了答案,将在这里复制。

我认为问题在于execute-api 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