如何在 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 用户池

在 Graphql 操场上使用 AWS Cognito 用户池对 AppSync 突变进行身份验证

使用 AWS Amplify 和 AWS Cognito 进行数据特定授权