amazon-web-services - “没有当前用户”:是否甚至可以通过 Amplify 使用身份验证类型 AMAZON_COGNITO_USER_POOLS 对 AWS AppSync 进行未经身份验证的调用?
问题描述
我有一个 AWS AppSync 架构,默认授权模式设置为Amazon Cognito User Pool。我使用AWS Amplify GraphQL 客户端从 Web 应用程序调用此 AppSync 端点,并且连贯地,它的配置也将 Cognito 用户池作为身份验证类型:
aws_appsync_authenticationType: 'AMAZON_COGNITO_USER_POOLS'
当用户通过身份验证时,它按预期工作;但是(尽管涉及的 Cognito 身份池已经设置了适当的 Auth 和 Unath 角色),当网站运行一些 Amplify fetch 命令时,例如未经身份验证的(访客)用户:
const item = await API.graphql(graphqlOperation(getItem, { id: 'my-id' }))
最后抛出一个错误:
"No current user"
好吧,如果我允许未经身份验证的用户,我希望它能够执行,但它只是失败了。寻找出路,我发现了一些讨论,例如:
而且,以上所有建议都建议重新访问 Amplify 配置,以便将 AppSync 身份验证类型从 转换AMAZON_COGNITO_USER_POOLS
为AWS_IAM
或API_KEY
。但是,由于某些详细原因1:
- 我想坚持使用
AMAZON_COGNITO_USER_POOLS
身份验证类型, - 并且仍然能够以访客用户的身份获取一些 AppSync 资源,除非它们受到
@aws_auth
装饰器等的限制。
有没有可能?
1我有更精细的控件,具体取决于用户组(管理员、普通等),带有装饰器,例如@aws_auth(cognito_groups: ["default-user-group"])
AppSync 架构。所以,我需要 Cognito 用户池来使用。
解决方案
因此,我刚刚经历了一个类似的问题并设法对其进行了排序。我希望这可以帮助你解决这个问题。您在问题中提到的SO 问题几乎是正确的方法。但是,有一个“小”小细节没有记录在案,我花了一段时间才找出来。
除了必须通过运行来启用经过身份验证和未经身份验证的访问amplify update auth
(您可以在上面链接的 SO 中看到如何),您还需要进行其他调整。
首先,在您的模型中,您需要将规则调整为:
@auth(
rules: [
# allow owners ability to update and delete their these messages (user pools)
{ allow: owner },
# allow all authenticated users to access this data
{ allow: private, provider: userPools },
# allow all guest users (not authenticated) to access this data
{ allow: public, provider: iam }
]
)
一旦您设置此模型以允许用户池访问他们“拥有”的所有数据,您也可以让任何“访客”用户也访问数据。
在前端,让我们以您的代码为例,您需要使用一些不同的方法:
代替
const item = await API.graphql(graphqlOperation(getItem, { id: 'my-id' }))
尝试类似的东西
// Check if the user is logged in or not
let isLoggedIn = await isLoggedIn();
const item = (await API.graphql({
query: getItem,
variables: { id: 'my-id' },
authMode: isLoggedIn ? GRAPHQL_AUTH_MODE.AMAZON_COGNITO_USER_POOLS : GRAPHQL_AUTH_MODE.AWS_IAM,
}));
顺便说一下“isLoggedIn”函数看起来像这样
async function isLoggedIn() {
// Another way to get if its a guest or not
//return await Auth.Credentials.getCredSource() === "guest"
try {
await Auth.currentAuthenticatedUser();
return true;
} catch {
return false;
}
}
所以......这条线就是它的诀窍,这并没有很好的记录。
authMode: isLoggedIn ? GRAPHQL_AUTH_MODE.AMAZON_COGNITO_USER_POOLS : GRAPHQL_AUTH_MODE.AWS_IAM
您需要根据用户的状态(登录或访客)来路径不同的方法,而不仅仅是 AWS_IAM 一个。
这只会让您阅读数据,以确保客人可以进行创建/更新/删除,并将数据所有权与彼此和登录用户分开,这是一个完全不同的故事,您需要开始挖掘使用解析器对其进行排序。但好消息是,有办法:)
推荐阅读
- node.js - 在数组对象中按类别查找在 Angular 前端中不起作用
- django - django order_by 使用条件
- python - 我可以获得与给定模型具有外键关系的模型列表吗?
- matlab - 将 (x,y) 坐标附加到 Matlab 循环中的变量以进行函数调用
- visual-studio-code - monaco-editor:垂直线填充
- java - 我应该将这些数据加载到什么数据结构中以及如何加载?
- python - Spark - tsv文件读为空
- visual-studio-code - 在 VScode 中运行 Python 3 时没有输出
- php - 如果管理面板的状态发生变化,则自动突出显示表格行
- vue.js - Vuejs 无关组件之间的事件