我一直在关注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。任何帮助表示赞赏。
答案 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