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

4 回复

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

解释

  1. 中间件的顺序:确保 app.use(session())app.use(passport.initialize()) 之前。因为 passport.initialize() 需要知道是否正在使用会话中间件来存储用户信息。

  2. 会话管理:如果你的应用需要会话管理,那么你需要引入 express-session 并将其作为中间件使用。passport.session() 用于恢复会话中的用户信息。

  3. 策略配置:在 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}`);
});

关键点解释

  1. passport.initialize(): 初始化 Passport,用于设置当前请求中的用户对象。
  2. passport.session(): 用于支持会话持久化,即在每次请求时自动恢复用户的登录状态。
  3. 确保在任何路由定义之前调用这些中间件,以确保它们在整个应用程序中生效。

如果不需要会话持久化,可以不使用 passport.session(),但必须确保 passport.initialize() 已被调用。

回到顶部