我正在使用Express构建的GraphQL服务器并尝试支持Relay。
对于常规的GraphQL查询,我可以在resolve函数中处理授权。 E.g:
const {nodeInterface, nodeField} = nodeDefinitions(
(globalId) => {
const {type, id} = fromGlobalId(globalId);
if (type === 'bar') {
// since I don't have access to the request object here, I can't pass the user to getBar, so getBar can't perform authorization
return getBar(id);
} else {
return null;
}
},
(obj) => {
// return the object type
}
);
为了支持后端的Relay重新获取,Facebook的Relay教程指示我们让GraphQL对象实现一个nodeInterface,用于将全局id到对象和对象映射到GraphQL类型。 nodeInterface由graphql-relay中的nodeDefinitions函数定义。
{node(id:"id_of_something_unauthorized"){
... on bar {
field_this_user_shouldnt_see
}
}}
传递给nodeDefinitions的重新获取函数不会传递给请求对象,只传递全局id。如何在重新获取期间访问用户,以便我可以授权这些请求?
作为一个完整性检查,我尝试查询经过身份验证的用户无法访问(并且不应该)通过节点接口访问的节点,并获取所请求的数据:
{
"data": {
"node": {
"field_this_user_shouldnt_see": "a secret"
}
}
}
=>
{{1}}
答案 0 :(得分:1)
事实证明,请求数据实际上已经通过解决。如果我们查看来源,我们会看到nodeDefinitions
抛出parent
参数并传递全局id
,context
(包含请求数据)和{来自info
的{1}}参数解析函数。
最终,nodeField
调用将获得以下参数:
resolve
(parent, args, context, info)
代替:
idFetcher
所以我们可以按如下方式实施授权:
(id, context, info)
https://github.com/graphql/graphql-relay-js/blob/master/src/node/node.js#L94-L102