【问题标题】:How to use a parse session token to make requests with graphql如何使用解析会话令牌通过 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,我无法弄清楚。

【问题讨论】:

    标签: session authentication parse-server graphql relay


    【解决方案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 来执行此操作?
    猜你喜欢
    • 2020-06-17
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2017-10-21
    • 2020-06-30
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多