session - 如何使用解析 session token 通过 graphql 发出请求

标签 session authentication parse-server graphql relay

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

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

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

If the user has signed in on the client, you could potentially pass up a session token to the server to allow for the parse queries to be made with that session token (for ACL reasons).

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

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

最佳答案

Express-Graphql supports a context option它将作为最后一个参数传递给所有解析器函数。您可以将 Parse session token 作为 header 传递给任何 /graphql 请求,然后通过 context 转发该请求,如下所示:

import graphqlHTTP from 'express-graphql';

const app = express();

app.use('/graphql', graphqlHTTP((req) => ({
  // ...
  context: {
    parseSessionToken: req.headers['parse-session-token'],
  },
})));

现在,在解析器函数中,您可以在查询中使用此 token ,以确保强制执行适当的 ACL:

function resolve (_, args, context) {
  return new Parse.Query('MyClass')
    .first({ sessionToken: context.parseSessionToken });
}

如果您在客户端使用 Relay,请使用 Relay.injectNetworkLayer像这样包含此 header :

Relay.injectNetworkLayer(
  new Relay.DefaultNetworkLayer('http://example.com/graphql', {
    headers: {
      'parse-session-token': Parse.User.current().getSessionToken(),
    },
  })
);

如果您使用 Apollo 客户端,请使用 createNetworkInterface在中间件函数中提供 header :

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

关于session - 如何使用解析 session token 通过 graphql 发出请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37167622/

相关文章:

python - 我们应该将 session 权限存储在 python 搁置中还是作为 session 变量?

asp.net - NTLM 和自动匿名身份验证 IIS

flutter - 尝试在dart(解析服务器SDK)中使用此包(flutter/dart)

ios - Swift 显示时间从 Date (NSDate) 开始

Python - 从当前浏览器操作和读取浏览器

ios - Parse SDK 不需要调用dispatch_get_main_queue(),对吧?

java - 有没有办法将 OGNL 与 Struts2 UI 标签绑定(bind)

asp.net - MVC 3 中的 SessionState 属性是否正常工作?

PHP::检测 session 是否开始的最佳方法

security - 使用物理 postgres 用户而不是 "logical"用户登录系统