Kiv*_*tar 5 passport.js express-session graphql graphql-subscriptions
我正在使用与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());
Run Code Online (Sandbox Code Playgroud)
这个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;
},
})));
Run Code Online (Sandbox Code Playgroud)
我的订阅是这样的:
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',
});
});
Run Code Online (Sandbox Code Playgroud)
我的课程在graphql查询和突变方面运行良好。但是我的订阅却没有。
我的目标是在我的订阅解析器上下文中访问我的用户会话。我可能需要在onConnect中访问诸如request.user之类的内容来填充上下文,但是我不知道该怎么做。
因此,经过一番修补后,我发现您需要做的基本上是通过重新运行中间件来运行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);
});
});
}),
Run Code Online (Sandbox Code Playgroud)
如果您使用的是,则express-session需要将其添加到上面。
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |