无法在类型“用户”graphql 上查询字段“密码”

Posted

技术标签:

【中文标题】无法在类型“用户”graphql 上查询字段“密码”【英文标题】:Cannot query field 'password' on type 'User' graphql 【发布时间】:2019-10-09 18:33:59 【问题描述】:

我正在使用 graphql 和 prisma。

datamodel.prisma

type User 
  id: ID! @id
  createdAt: DateTime! @createdAt
  updatedAt: DateTime! @updatedAt
  email: String! @unique
  password: String!
  first_name: String

schema.graphql

scalar Date

type Query 
  users: [User!]!


type User 
  id: ID!
  createdAt: Date!
  updatedAt: Date!
  email: String!
  first_name: String

解析器

users: (parent, args, context) => 
  return context.prisma.users();

我希望得到一个用户列表,但收到了错误: 查询


  users 
    email
  

错误

"Cannot query field 'password' on type 'User'. (line 7, column 5):\n password\n ^"

更新 1 尝试使用片段,但得到了相同的结果:


  users 
    ...userFields
  


fragment userFields on User 
  email

【问题讨论】:

当我删除密码字段时 - 一切正常,但我需要这个字段来创建用户。 使用fragments @xadm 一样的 users ...userFields fragment userFields on User email ... 将用户类型克隆到 UserInput(用于变异/创建用途),从用户类型中删除密码 @xadm 你能提供一些小例子吗? 【参考方案1】:

我还想添加一个场景,它很容易导致同样的问题,我需要一段时间才能调试,我相信其他人会遇到,因为我花了很长时间才意识到问题实际上是在我定义身份验证相关突变的 FRONTEND 代码中引起。

设置

这是我在开发大部分应用程序时的样子:

datamodel.prisma(为简单起见,我省略了一些字段)

type User 
  id: ID! @id
  name: String!
  email: String! @unique
  password: String!

schema.graphql(为简单起见仅显示 signUp 突变)

type Mutation 
  signUp(email: String!, password: String!, name: String!): User!

SignUp.js(我在此处访问schema.graphql 中暴露的signUp 突变)

const SIGNUP_MUTATION = gql`
  mutation SIGNUP_MUTATION(
    $email: String!
    $name: String!
    $password: String!
  ) 
    signUp(email: $email, name: $name, password: $password) 
      id
      email
      name
      password
    
  
`

请注意,我正在返回 idemailnamepassword - 这是因为我想确保一切都在开发中。


引入Cannot query field 'password' on type 'User' 错误

当我开始从事安全工作并在schema.graphql 中创建了一个特殊的User 类型以便我可以隐藏password 等受保护字段时,我就遇到了这个问题:

schema.graphql(请注意,我现在没有在这种面向前端的用户类型上公开password 字段)

type Mutation 
  signUp(email: String!, password: String!, name: String!): User!


type User 
  id: ID!
  name: String!
  email: String!

解决方案

由于此错误消息的性质,我早上的大部分时间都在对后端代码感到困惑。但事实证明,错误实际上是在SignUp.js 中引起的,我正在返回password 字段。

解决方案是简单地从返回字段列表中删除该行,如下所示:

const SIGNUP_MUTATION = gql`
  mutation SIGNUP_MUTATION(
    $email: String!
    $name: String!
    $password: String!
  ) 
    signUp(email: $email, name: $name, password: $password) 
      id
      email
      name
    
  
`

主要经验

    因此,如果您遇到此问题,请检查您的所有相关突变,并确保您没有返回我在此处描述的受保护的任何字段。

    请务必检查您的前端代码,并确保您没有尝试返回您现在已保护且不再向前端公开的字段。

我希望这会有所帮助并为人们节省一些时间!

【讨论】:

【参考方案2】:

...啊啊棱镜...

我不知道是否支持接口、联合或输入类型。 Graphqldocs

Prisma 几乎可以生成所有内容...但是根据需要为数据模型定义密码(作为 DBB 生成的类型)不应阻止查询类型子集或在现有模型上定义的类型而不使用所有字段。

对我来说,这是一个有点误导性的错误信息。它可以与解析器相关。

尝试在解析器中输入match 类型,不要返回直接 prisma 查询(对模型类型进行操作),而是映射查询数据(一个数组)以过滤掉密码字段/属性(与查询类型兼容)。这也是一个安全问题 - 不应从外部读取密码。

【讨论】:

是的,我创建了返回片段的自定义查询,似乎错误消失了。【参考方案3】:

我创建了返回片段的自定义查询,并且似乎错误消失了。

【讨论】:

【参考方案4】:

只需在您的控制台中运行(在 prisma 文件夹中):

PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy

【讨论】:

以上是关于无法在类型“用户”graphql 上查询字段“密码”的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/Relay Schema 无法在“CreateLinkPayload”类型上查询字段“store”

Gatsby GraphQL 无法在 Strapi 的“文件”类型上查询字段“url”

gatsby graphql 无法在“Query”类型上查询字段“allTribeEvents”

将 GraphQL/Prisma 字段设为私有/无法查询

无法查询类型 Query 上的字段注册

Nestjs - Mongoose - 虚拟字段 - 无法在 graphql 操场上查询