如何使用解析会话令牌使用graphql发出请求

时间:2016-05-11 15:50:34

标签: session authentication parse-server graphql relay

我有一个解析应用程序,我想在每个请求中发送sessionToken,所以我知道哪个用户正在访问什么。就像这篇帖子一样。

How to build a web app with GraphQL + parse.com?

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

  

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

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

有没有人想出如何使用解析服务器和身份验证? F8应用程序已将其删除,目前已将其标记为TODO,我无法解决此问题。

1 个答案:

答案 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,
});