如何在 Graphql 和 AWS Cognito 中查询已登录用户的数据
Posted
技术标签:
【中文标题】如何在 Graphql 和 AWS Cognito 中查询已登录用户的数据【英文标题】:How to query for a signed in user's data in Graphql and AWS Cognito 【发布时间】:2021-11-15 07:06:02 【问题描述】:我正在尝试使用 AWS Cognito、Appsync 和 Graphql 查询用户的特定数据。在我将架构规则更改为包含@auth
之前,我能够访问所有用户的所有数据,但这不是我想要的。但是,当我使用 Graphql 查询数据时,我收到了一个 auauthorized 错误。 errorType: "Unauthorized", message: "Not Authorized to access listMembers on type Query", …
// Old Schema.graphql
type Member
id: ID!,
name: String,
owner: String
// New Schema.graphql
type Member
@model
@auth(rules: [ allow: owner , allow: private, operations: [read] ])
id: ID!
name: String
owner: String
在我的 Members.js 组件中,我调用了成员列表并确保我已设置 owner 属性可用,但我仍然收到未经授权的错误。此外,当我进入 AWS AppSync 控制台并尝试查询成员列表时,我得到了同样的错误。
我知道我的 DynamoDB 中有成员,因为它们存在,但是当我查询它们时,我得到了那个错误。
这是我的 Member.js 组件的样子:
// Members.js
import useState, useEffect from 'react'
import API, Auth from 'aws-amplify'
import listMembers from '../../graphql/queries'
const [members, updateMembers] = useState([])
const [myMembers, updateMyMembers] = useState([])
export const Members = () =>
/* fetch member's when component loads */
useEffect(() =>
fetchMembers()
, [])
async function fetchMembers()
/* query the API, ask for 100 items */
let postData = await API.graphql(
query: query: listMemberes, variables: limit: 100 ,
variables: limit: 100 ,
)
let membersArray = postData.data.listMembers.items
updateLoading(false)
/* update the members array in the local state */
setMemberState(membersArray)
async function setMemberState(membersArray)
const user = await Auth.currentAuthenticatedUser()
const myMemberData = membersArray.filter((p) => p.owner === user.username)
console.log('membersArray:', membersArray)
updateMyMembers(myMemberData)
updateMembers(membersArray)
【问题讨论】:
【参考方案1】:您必须添加 2 个附加规则:
type Member
@model
@auth(
rules: [
allow: owner
allow: public, operations: [create, read, update, delete] // New
allow: private, operations: [create, read, update, delete] // New
]
)
id: ID!
name: String
owner: String
【讨论】:
【参考方案2】:可能您的默认身份验证方法是 API_KEY
您可以在 aws-export.js 文件中看到这一点。
"aws_appsync_authenticationType": "API_KEY",
因此,您必须稍微更改您的请求,以便它使用您登录的 cognito 用户:
let postData = await API.graphql(
query: query: listMemberes, variables: limit: 100 ,
variables: limit: 100 ,
authMode: 'AMAZON_COGNITO_USER_POOLS'
)
来源: https://docs.amplify.aws/lib/graphqlapi/query-data/q/platform/js/#simple-query
【讨论】:
以上是关于如何在 Graphql 和 AWS Cognito 中查询已登录用户的数据的主要内容,如果未能解决你的问题,请参考以下文章
将 Cognito 中的用户信息与 AWS Amplify GraphQL 关联
如何在 Graphql 架构级别检查 AWS AppSync OIDC 指令的角色或权限
链接到 Cognito 用户池的 AWS Amplify GraphQL 架构
Aws Amplify 在一个 GraphQL Api 中使用多个 Cognito 用户池