如何使用subscriptions-transport-ws与护照和快递会话

时间:2017-11-28 08:12:49

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

我使用的护照本地策略适用于快递:

<form>

这个localStrategy正在进行Mongoose调用,以基于他的pubKey获取用户,我猜这个request.user就是用这种方式填充的。

我设置了我的graphql端点:

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());

我的订阅方式如下:

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

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

我的目标是在订阅解析程序上下文中访问我的用户会话。我可能需要访问onConnect中的request.user这样的内容来填充上下文,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

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

// 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,则需要将其添加到上面。