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 订阅:基于更新文档中的对象的复杂授权

使用 cognito 进行 Appsync graphql 授权

AWS AppSync GraphQL 读取策略没有任何效果