2

我有一个解析应用程序,我想在每个请求中发送 sessionToken,这样我就知道哪个用户正在访问什么。就像这篇文章提到的一样。

如何使用 GraphQL + parse.com 构建 Web 应用程序?

丹尼尔留下了这条评论,我似乎无法做他提到的事情。

如果用户已在客户端登录,您可能会将会话令牌传递给服务器,以允许使用该会话令牌进行解析查询(出于 ACL 原因)。

在 Relay 中,我看到您可以通过 将 sessionToken 注入headersnetworkLayer,但是在我的 graphql 服务器中,我似乎无法通过rootValue属性访问此 sessionToken 和激情到 graphql。

有人知道如何使用解析服务器和身份验证吗?F8 应用程序已将其删除,目前已将其标记为 a TODO,我无法弄清楚。

4

1 回答 1

3

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,
});
于 2016-07-19T21:32:49.847 回答