我应该为私有用户属性使用指令吗?我们说name
,avatar
是公开可读的,但email
不是。在这些私有字段上发出指令是否常见,以便只有所有者才能查询它们?
基本上这个
query User($id: ID!, $isMe: Boolean) {
user(id: $id) {
name
avatar
email @include(if: $isMe)
}
}
我不相信这里的客户只是因为他们说'嘿嘿是我的!"我还希望服务器进一步验证如果isMe
为真,context.user.id
必须等于id
(已编辑)
这是正确的做法,还是有更惯用的方式来实现这一目标?
答案 0 :(得分:0)
如果请求私有字段且用户未经过身份验证,则取决于您要实现的行为。一个常见的解决方案是使这些字段可以为空,并且在每个字段的解析器中,如果检查失败,则返回null:
resolve: (user, args, context) => {
if (context.user.id !== user.id) return null
return user.email
}
这意味着客户端可能会请求该类型的所有字段,并且它将始终只返回当前用户可以查看的字段。
但是,您可能根本不希望客户端在无法查看这些字段时请求这些字段。也许你想要在他们要求的时候抛出一个错误(因为如果他们被请求,那么客户端会有一些问题,我们想让他们知道)。然后指令提供了一个很好的方法来做到这一点。但是,您需要实现自定义指令。
Apollo有一个关于创建模式指令的广泛教程,包括一个用于验证身份验证的教程 - 你可以check it out here。