GraphQL查询中的授权指令

时间:2018-05-28 13:02:00

标签: authorization graphql directive

我应该为私有用户属性使用指令吗?我们说nameavatar是公开可读的,但email不是。在这些私有字段上发出指令是否常见,以便只有所有者才能查询它们?

基本上这个

query User($id: ID!, $isMe: Boolean) {
  user(id: $id) {
    name
    avatar
    email @include(if: $isMe)
  }
}

我不相信这里的客户只是因为他们说'嘿嘿是我的!"我还希望服务器进一步验证如果isMe为真,context.user.id必须等于id(已编辑)

这是正确的做法,还是有更惯用的方式来实现这一目标?

1 个答案:

答案 0 :(得分:0)

如果请求私有字段且用户未经过身份验证,则取决于您要实现的行为。一个常见的解决方案是使这些字段可以为空,并且在每个字段的解析器中,如果检查失败,则返回null:

resolve: (user, args, context) => {
  if (context.user.id !== user.id) return null
  return user.email
}

这意味着客户端可能会请求该类型的所有字段,并且它将始终只返回当前用户可以查看的字段。

但是,您可能根本不希望客户端在无法查看这些字段时请求这些字段。也许你想要在他们要求的时候抛出一个错误(因为如果他们被请求,那么客户端会有一些问题,我们想让他们知道)。然后指令提供了一个很好的方法来做到这一点。但是,您需要实现自定义指令。

Apollo有一个关于创建模式指令的广泛教程,包括一个用于验证身份验证的教程 - 你可以check it out here