Nodejs express 使用passport 出现 passport.initialize() middleware not in use错误
Nodejs express 使用passport 出现 passport.initialize() middleware not in use错误
app.get("/login/github", passport.authenticate(“github”, {session: false}));
app.get("/login/github/callback", passport.authenticate(“github”, {
session: false,
failureRedirect: ‘/login’,
successFlash: ‘登陆成功!’
}), function (req, res) {
req.session.user = {name: req.user.username, head: “https://gravatar.com/avatar/” + req.user._json.gravatar_id + “?s=48”};
res.redirect(’/’);
});
app.js里面也添加了:
app.use(passport.initialize());
passport.use(new GithubStrategy({
clientID: "xxx",
clientSecret: "xxx",
callbackURL: "xxx"
}, function(accessToken, refreshToken, profile, done) {
done(null, profile);
}));
Nodejs express 使用passport 出现 passport.initialize() middleware not in use
错误
在使用 passport
进行身份验证时,如果遇到 passport.initialize() middleware not in use
的错误,通常是因为你没有正确地将 passport.initialize()
中间件添加到你的 Express 应用程序中。确保在你的应用初始化时已经添加了该中间件。
示例代码
首先,确保你在你的 app.js
文件中正确地添加了 passport.initialize()
和 passport.session()
中间件(如果需要会话管理的话)。
// app.js
const express = require('express');
const passport = require('passport');
const session = require('express-session'); // 如果需要会话管理
const GitHubStrategy = require('passport-github2').Strategy;
// 初始化 Express 应用
const app = express();
// 配置 Passport
passport.use(new GitHubStrategy({
clientID: 'your_client_id',
clientSecret: 'your_client_secret',
callbackURL: 'http://localhost:3000/auth/github/callback'
},
function(accessToken, refreshToken, profile, cb) {
return cb(null, profile);
}
));
// 使用 session 中间件
app.use(session({
secret: 'your_secret_key',
resave: false,
saveUninitialized: false
}));
// 初始化 Passport
app.use(passport.initialize());
app.use(passport.session());
// 路由配置
app.get('/auth/github', passport.authenticate('github'));
app.get('/auth/github/callback',
passport.authenticate('github', { failureRedirect: '/login' }),
function(req, res) {
// 成功认证后的逻辑
req.session.user = { name: req.user.username, head: "https://gravatar.com/avatar/" + req.user._json.gravatar_id + "?s=48" };
res.redirect('/');
});
// 启动服务器
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
解释
-
中间件的顺序:确保
app.use(session())
在app.use(passport.initialize())
之前。因为passport.initialize()
需要知道是否正在使用会话中间件来存储用户信息。 -
会话管理:如果你的应用需要会话管理,那么你需要引入
express-session
并将其作为中间件使用。passport.session()
用于恢复会话中的用户信息。 -
策略配置:在
passport.use()
中配置你的认证策略,例如 GitHub 策略。这里使用的是passport-github2
模块。
通过以上步骤,你应该能够解决 passport.initialize() middleware not in use
的错误,并实现基于 GitHub 的登录功能。
app.js文件 app.use(express.cookieParser()) app.use(express.session({secret: ‘blog.fens.me’, cookie: { maxAge: 60000 }})); app.use(passport.initialize()); app.use(passport.session());
详细使用参考文章 http://blog.fens.me/nodejs-express-passport/ http://blog.fens.me/nodejs-oauth-passport/
我知道问题了,是因为我git账号没有设置公开邮箱。您的系列教程讲的不错。
根据你的描述,你在使用 passport
时遇到了 passport.initialize() middleware not in use
的错误。这个问题通常是因为 passport.initialize()
中间件没有被正确地应用到 Express 应用程序中。
解决方案
确保在应用路由之前调用 passport.initialize()
中间件。此外,如果你需要持久化用户登录状态(例如,通过会话),还需要调用 passport.session()
中间件。
示例代码
在你的 app.js
文件中,确保以下代码出现在所有路由定义之前:
const express = require('express');
const passport = require('passport');
const GitHubStrategy = require('passport-github').Strategy;
// 初始化 Express 应用
const app = express();
// 配置 Passport
passport.use(new GitHubStrategy({
clientID: "xxx",
clientSecret: "xxx",
callbackURL: "xxx"
}, (accessToken, refreshToken, profile, cb) => {
// 这里可以处理验证逻辑,将用户信息存储在数据库或会话中
return cb(null, profile);
}));
// 初始化 Passport
app.use(passport.initialize());
// 如果需要持久化用户登录状态
app.use(passport.session());
// 路由定义
app.get("/login/github", passport.authenticate("github", { session: false }));
app.get("/login/github/callback",
passport.authenticate("github", {
session: false,
failureRedirect: '/login',
successFlash: '登陆成功!'
}),
(req, res) => {
req.session.user = {
name: req.user.username,
head: "https://gravatar.com/avatar/" + req.user._json.gravatar_id + "?s=48"
};
res.redirect('/');
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
关键点解释
passport.initialize()
: 初始化 Passport,用于设置当前请求中的用户对象。passport.session()
: 用于支持会话持久化,即在每次请求时自动恢复用户的登录状态。- 确保在任何路由定义之前调用这些中间件,以确保它们在整个应用程序中生效。
如果不需要会话持久化,可以不使用 passport.session()
,但必须确保 passport.initialize()
已被调用。