如何使用解析会话令牌通过 graphql 发出请求
Posted
技术标签:
【中文标题】如何使用解析会话令牌通过 graphql 发出请求【英文标题】:How to use a parse session token to make requests with graphql 【发布时间】:2016-09-07 03:34:40 【问题描述】:我有一个解析应用程序,我想在每个请求中发送 sessionToken,这样我就知道哪个用户正在访问什么。就像这篇文章提到的那样。
How to build a web app with GraphQL + parse.com?
Daniel 留下了这条评论,我似乎无法按照他所说的去做。
如果用户已在客户端登录,您可能会将会话令牌传递给服务器,以允许使用该会话令牌进行解析查询(出于 ACL 原因)。
在 Relay 中,我看到您可以通过 headers
将 sessionToken 注入 networkLayer,
但是在我的graphql 服务器中,我似乎无法通过rootValue
属性访问这个sessionToken 和passion 到graphql。
有人知道如何使用解析服务器和身份验证吗?
F8 应用程序已将其删除,目前已将其标记为 TODO
,我无法弄清楚。
【问题讨论】:
【参考方案1】: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,请使用 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,
);
【讨论】:
谢谢@namuol,我正在使用 Relay,我想在客户端添加一个登录功能来获取用户的令牌。有什么简单的方法可以做到这一点吗?我是否需要在 express 端创建一个单独的 API,或者我可以使用 graphQL 来执行此操作?以上是关于如何使用解析会话令牌通过 graphql 发出请求的主要内容,如果未能解决你的问题,请参考以下文章
DJANGO-GRAPHQL-JWT:我们如何知道刷新令牌发布后的年龄?