Express-Graphql 支持一个context
选项,该选项将作为最后一个参数传递给所有解析器函数。您可以将 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,请使用Relay.injectNetworkLayer
包含此标头,如下所示:
Relay.injectNetworkLayer(
new Relay.DefaultNetworkLayer('http://example.com/graphql', {
headers: {
'parse-session-token': Parse.User.current().getSessionToken(),
},
})
);
如果您使用的是 Apollo 客户端,请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,
});