GraphQL + Relay:如何执行重新授权的授权?

时间:2017-01-25 03:42:35

标签: express graphql relay

我正在使用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}}

1 个答案:

答案 0 :(得分:1)

事实证明,请求数据实际上已经通过解决。如果我们查看来源,我们会看到nodeDefinitions抛出parent参数并传递全局idcontext(包含请求数据)和{来自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