passport.js - 如何使用带有 Passport 和快速 session 的订阅传输 ws

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

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

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

我的 session 在 graphql 查询和突变上运行良好。但不是我的订阅。

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

最佳答案

因此,经过一些修补后,我发现您需要做的基本上是运行所有重新创建 passport 的程序。用于 socket 的 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您需要将其添加到上述内容中。

关于passport.js - 如何使用带有 Passport 和快速 session 的订阅传输 ws,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526793/

相关文章:

node.js - Passport js 使用sequelize进行本地身份验证

ios - Facebook iOS SDK 和 Passport -facebook 身份验证

node.js - FacebookToken错误: This authorization code has been used passport-js

reactjs - React-apollo-hooks useMutation

node.js - 快速 session 中的 req.session 不持久

javascript - express 发送 Passport 到 app.use(route)

django - Graphite 烯-django : 'Meta.model' without either 'Meta.fields' or 'Meta.exclude' has been deprecated since 0. 15.0 现在被禁止

graphql - 如何根据PageQuery的结果获取Gatsby Images?

javascript - node express,注销后如何清除cookie

node.js - Node 快速 session 不工作。为下一个请求获取未定义的 req.session.user