【问题标题】:How to use subscriptions-transport-ws with passport and express-session如何使用 subscriptions-transport-ws 与护照和快速会话
【发布时间】:2018-05-11 15:04:12
【问题描述】:

我正在使用与 express 配合良好的护照本地策略:

passport.use(localStrategy);
passport.serializeUser((user, done) => done(null, JSON.stringify(user)));
passport.deserializeUser((obj, done) => done(null, JSON.parse(obj)));
app.use(passport.initialize());
app.use(passport.session());

这个 localStrategy 正在执行 Mongoose 调用以根据他的 pubKey 获取用户,我猜 request.user 是通过这种方式填充的。

我这样设置我的 graphql 端点:

app.use('/graphql', bodyParser.json(), graphqlExpress(request => ({
  debug: true,
  schema,
  context: {
    user: request.user,
    req: request,
  },
  formatError: (e) => {
    console.log(JSON.stringify(e, null, 2));
    return e;
  },
})));

我的订阅是这样的:

const ws = createServer(app);

// Run the server
ws.listen(settings.APP_PORT, () => {
  console.log(`App listening on port ${settings.APP_PORT}!`);
  // Set up the WebSocket for handling GraphQL subscriptions
  new SubscriptionServer({
    execute,
    subscribe,
    schema,
    onConnect: (connectionParams, webSocket) => {
      console.log(webSocket.upgradeReq);
      return { user: connectionParams };
    },
  }, {
    server: ws,
    path: '/subscriptions',
  });
});

我的会话在 graphql 查询和突变方面运行良好。但不是我的订阅。

我的目标是在我的订阅解析器上下文中访问我的用户会话。我可能需要访问 onConnect 中的 request.user 之类的东西来填充上下文,但我不知道该怎么做。

【问题讨论】:

    标签: passport.js graphql express-session graphql-subscriptions


    【解决方案1】:

    所以经过一些修补后,我发现您需要做的基本上是通过重新运行中间件来运行为套接字的upgradeReq 重新创建passport 的所有内容:

    // Start with storing the middleware in constants
    const passportInit = passport.initialize();
    const passportSession = passport.session();
    app.use(passportInit);
    app.use(passportSession);
    
    ...
    // Now populate the request with the upgradeReq using those constants
    onConnect: (connectionParams, webSocket) => new Promise((resolve) => {
      passportInit(webSocket.upgradeReq, {}, () => {
        passportSession(webSocket.upgradeReq, {}, () => {
          resolve(webSocket.upgradeReq);
        });
      });
    }),
    

    如果您使用的是express-session,则需要将其添加到上面。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2016-10-27
      • 2017-02-07
      • 2019-07-09
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 2023-01-21
      • 2019-06-23
      相关资源
      最近更新 更多