AWS AppSync - 未经授权的异常
Posted
技术标签:
【中文标题】AWS AppSync - 未经授权的异常【英文标题】:AWS AppSync - Unauthorized Exception 【发布时间】:2019-03-11 12:39:54 【问题描述】:我已开始使用 AWS AppSync,但遇到了权限问题。
我使用 AppSync 为我的数据创建了一个 DynamoDB 表,并设置了与我已经创建的 Cognito 用户池一起使用的授权。
我将默认操作设置为 ALLOW
,根据 AWS 文档 -https://docs.aws.amazon.com/appsync/latest/devguide/security.html#amazon-cognito-user-pools-authorization - 默认情况下,它应该允许公共访问运行我的架构中定义的任何查询/突变/订阅。
上面的文档还说限制访问是通过在我的类型定义中添加@aws_auth
来完成的。我还没有添加。
这就是我想要的:我希望我的查询是公开的 - 不需要添加 @aws_auth
指令 - 并且我的突变被限制在我的 Cognito 用户池中的 Admins 组中。因此,在测试查询时,我应该能够将数据返回给我,而无需在任何地方登录。
但是,当尝试在 AppSync 控制台中运行任何测试查询时,我收到以下错误消息:
"errors": [
"errorType": "UnauthorizedException",
"message": "Unable to parse JWT token."
]
显然,这与未使用 Cognito 登录有关。
我之前在没有使用 Cognito 授权的情况下测试过这些查询,它们都运行良好。由于我的 Cognito 授权方的默认操作设置为 ALLOW
,因此我的查询现在应该运行相同,因为我没有修改它们。
查看我的查询、类型和解析器的代码,我看不出它们的编写方式有什么不同。允许访问我的 DynamoDB 表的 IAM 角色也保持不变,并且没有附加任何限制。
发生了什么事? AppSync 是否存在错误,或者我在这里遗漏了什么?
请告诉我。谢谢
【问题讨论】:
你找到解决办法了吗? @Aldarund 截至目前,AppSync 似乎在使用 Cognito 进行身份验证时不支持公共访问。所以我制作了两个 AppSync 项目,一个使用 API 密钥供公众访问,另一个使用 Cognito 供管理员使用。但是可以使用 AWS IAM 允许混合访问公共和私有访问,但我还没有尝试过。 github.com/aws-amplify/amplify-js/issues/1252 【参考方案1】:我认为您的 API 密钥过期日期已经结束。所以转到 -- API -> 选择您的 AppSync -> 转到设置 -> 选择您的 API 密钥 -> 然后编辑 -> 现在您处于“配置您的 API 密钥并更改到期日期”中。 -> 选择过期 选择此 API 密钥何时到期 在这里,您可以选择自创建新 API 密钥之日起 1 年。
【讨论】:
将授权类型设置为 Amazon Cognito 用户池,API 密钥默认设置为无。答案具有误导性。 未授权异常来自密钥已过期或在 DynamoDB 表中使用的查询中缺少某些参数。上面的答案没有误导。@Cris69 谢谢。 (转到 Appsync -> API ...) 答案具有误导性。 cognito和api key有什么关系?【参考方案2】:您是在“查询”控制台中谈论的吗?即使您已登录 AWS 账户并转到 AWS AppSync 查询控制台,您仍需要以 cognito 用户身份单独登录。点击“使用用户池登录”按钮。
从那里,只需输入您已经创建的 cognito 用户的信息,这将模拟登录以进行测试。您可以在项目中的 aws-exports.js 文件中找到您的 clientId:“aws_user_pools_web_client_id”。
希望有帮助!
【讨论】:
您可以从查询控制台发送 x-api-key 值吗?以上是关于AWS AppSync - 未经授权的异常的主要内容,如果未能解决你的问题,请参考以下文章
具有 Cognito 联合身份的 AWS AppSync IAM 授权
通过 AWS AppSync GraphQL API 使用多种授权类型
AWS Amplify (AppSync + Cognito) 使用每个组织/租户的动态组进行授权
AWS AppSync 订阅:基于更新文档中的对象的复杂授权