我有一个解析应用程序,我想在每个请求中发送sessionToken,所以我知道哪个用户正在访问什么。就像这篇帖子一样。
How to build a web app with GraphQL + parse.com?
丹尼尔留下了这个评论,我似乎无法做到他所提到的。
如果用户已登录客户端,您可能会将会话令牌传递给服务器,以允许使用该会话令牌进行解析查询(出于ACL原因)。
在Relay中,我看到你可以通过headers
将sessionToken注入networkLayer,
但是在我的graphql服务器中,我似乎无法通过rootValue
属性访问此sessionToken和激情到graphql。
有没有人想出如何使用解析服务器和身份验证?
F8应用程序已将其删除,目前已将其标记为TODO
,我无法解决此问题。
答案 0 :(得分:3)
Express-Graphql supports a context
option将作为所有解析器函数的最后一个参数传递。您可以将Parse会话令牌作为标头传递给任何/graphql
个请求,然后通过context
转发,如下所示:
import graphqlHTTP from 'express-graphql';
const app = express();
app.use('/graphql', graphqlHTTP((req) => ({
// ...
context: {
parseSessionToken: req.headers['parse-session-token'],
},
})));
现在在解析器函数中,您可以将此标记与查询一起使用,以确保强制执行适当的ACL:
function resolve (_, args, context) {
return new Parse.Query('MyClass')
.first({ sessionToken: context.parseSessionToken });
}
如果您在客户端使用中继,请使用Relay.injectNetworkLayer
包含此标头,如下所示:
Relay.injectNetworkLayer(
new Relay.DefaultNetworkLayer('http://example.com/graphql', {
headers: {
'parse-session-token': Parse.User.current().getSessionToken(),
},
})
);
如果你正在使用Apollo Client,请在中间件功能中使用createNetworkInterface
来提供标题:
import ApolloClient, { createNetworkInterface } from 'apollo-client';
const networkInterface = createNetworkInterface('http://example.com/graphql');
networkInterface.use([{
applyMiddleware(req, next) {
if (!req.options.headers) {
req.options.headers = {}; // Create the header object if needed.
}
req.options.headers['parse-session-token'] = Parse.User.current().getSessionToken();
next();
}
}]);
const client = new ApolloClient({
networkInterface,
});