我在节点应用程序中有一个graphql端点,我想将其包装在身份验证中间件中以验证和提取JWT。但是,希望某些查询/变体(即注册和登录)是公开的,而其余的则要受到保护。
我有一台简单的服务器,混合了express
和apolloServer
:
const app = express();
const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app });
const PORT = process.env.PORT || 3042;
app.listen(PORT, () => console.log(`Listening on ${PORT}`) )
export default app
我当时想我应该使用通行证来制定一种策略,以提取并验证JWT和用户并将authMiddleware
应用于apolloServer或/graphql
端点。
passport.use(new JWTStrategy({
jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
secretOrKey : JWT_SECRET
},
(jwtPayload, cb) => {
return UserModel.findOne({email: jwtPayload.email})
.then(user => {
return cb(null, user);
})
.catch(err => {
return cb(err);
});
}
));
const authMiddleware = passport.authenticate('jwt', { session: false })
这适用于rest API,您可以在其中将中间件应用于所需的路由,但我只希望它在某些突变/查询上运行。
如何在graphql API中处理验证/提取JWT?