要在Apollo Server中使用Passport-JWT进行身份验证,您可以按照以下步骤进行操作。
首先,确保您已经安装了所需的包。在项目根目录中运行以下命令:
npm install apollo-server-express passport passport-jwt
接下来,创建一个名为auth.js
的文件,并将以下代码添加到该文件中:
const passport = require('passport');
const passportJwt = require('passport-jwt');
const { Strategy: JwtStrategy, ExtractJwt } = passportJwt;
// 导入您的用户模型
const User = require('./models/User');
// 配置Passport-JWT策略
const jwtOptions = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'your-secret-key',
};
passport.use(
new JwtStrategy(jwtOptions, async (jwtPayload, done) => {
try {
// 在此处执行逻辑来验证用户,并从数据库中获取用户信息
const user = await User.findById(jwtPayload.id);
if (user) {
return done(null, user);
} else {
return done(null, false);
}
} catch (error) {
return done(error, false);
}
})
);
module.exports = passport;
请确保替换'your-secret-key'
为您自己的密钥,并根据您的项目结构调整用户模型的导入。
然后,在index.js
或主要入口文件中,添加以下代码:
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const passport = require('./auth'); // 导入Passport实例
// 导入您的GraphQL模式和解析程序
const typeDefs = require('./schema');
const resolvers = require('./resolvers');
const app = express();
// 应用Passport中间件
app.use(passport.initialize());
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
// 验证用户身份并将其附加到上下文中
passport.authenticate('jwt', { session: false }, (error, user) => {
req.user = user;
})(req);
return { req };
},
});
server.applyMiddleware({ app });
app.listen({ port: 4000 }, () =>
console.log(`Server is running at http://localhost:4000${server.graphqlPath}`)
);
这段代码将在Apollo Server中应用Passport中间件,并将经过身份验证的用户附加到每个GraphQL请求的上下文中。
现在,您可以在解析程序中访问req.user
来获取当前经过身份验证的用户。
请注意,此示例中使用的是JWT身份验证策略。您还可以根据需要使用其他Passport策略(例如本地用户名和密码验证)。
希望这可以帮助到您!