如何使用解析会话令牌通过 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:我们如何知道刷新令牌发布后的年龄?

如何在不使用会话的情况下获取图形令牌?

如何以及在何处生成 CSRF 令牌以通​​过 REST API 向 Django 应用程序发出请求?

如何使用操作查询发出多个 Alamofire 请求

基于令牌的身份验证中的会话

如何在整个会话中保留 JWT 令牌直到用户注销?