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

时间:2019-05-23 08:18:43

标签: graphql schema react-apollo prisma

我正在使用graphql和pyramida。

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 ^"

enter image description here

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

{
  users {
    ...userFields
  }
}

fragment userFields on User {
  email
}

4 个答案:

答案 0 :(得分:1)

我还想添加一个场景,该场景很容易导致同一问题,这使我花了一些时间进行调试,而且我敢肯定会遇到其他问题,因为花了我很多时间才意识到问题实际上是是由于我在定义与身份验证相关的Mutations的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(我访问signUp中公开的schema.graphql突变)

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'错误

一旦我开始从事安全工作,并在User中创建了一种特殊的schema.graphql类型,以便可以隐藏诸如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
    }
  }
`

主要经验教训

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

  2. 请确保还检查您的前端代码,并确保您不尝试返回现在已经受保护且不再暴露于前端的字段。

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

答案 1 :(得分:0)

... aaah Prisma ...

我不知道是否支持接口,联合或输入类型。 Graphql docs

Prisma几乎可以生成所有内容……但是,如果需要为数据模型定义密码(作为DBB生成的类型),则不应在不使用所有字段的情况下阻止查询现有模型中定义的类型子集或类型。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

PRISMA_MANAGEMENT_API_SECRET=mysecret42 prisma deploy