【问题标题】:nodejs/passport - Error: OAuthStrategy requires session supportnodejs/passport - 错误:OAuthStrategy 需要会话支持
【发布时间】:2014-04-13 10:19:36
【问题描述】:

我正在尝试使用护照模块在我的网络应用上设置 twitter 连接

我已经实现如下:

App.js 文件:

 /**
 * Module dependencies.
 */
var express     = require('express');
var user        = require('./server/routes/user');
var http        = require('http');
var path        = require('path');
var app         = express();
var passport    = require('passport');
var flash       = require('connect-flash');

require('./server/config/passport')(passport); // pass passport for configuration

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.configure(function() {

    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(require('stylus').middleware(path.join(__dirname, 'public')));
    app.use(express.static(path.join(__dirname, 'public')));

    // set up our express application
    app.use(express.logger('dev')); // log every request to the console
    app.use(express.cookieParser()); // read cookies (needed for auth)
    app.use(express.bodyParser()); // get information from html forms

    app.set('view engine', 'ejs'); // set up ejs for templating

    // required for passport
    app.use(express.session({ secret: 'SECRET' })); // session secret
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash()); // use connect-flash for flash messages stored in session

});


// // routes ======================================================================
require('./server/routes/index')(app, passport); // load our routes and pass in our app and fully configured passport

我正在使用 express.session,但在尝试进行身份验证时收到以下错误消息:

Error: OAuthStrategy requires session support. Did you forget app.use(express.session(...))?

有人知道我为什么会得到这个吗?

【问题讨论】:

    标签: node.js twitter oauth twitter-oauth passport.js


    【解决方案1】:

    加载 Express 中间件的顺序不对。试试这个:

    // ...
    
    app.configure(function() {
      app.use(express.favicon());
      app.use(express.logger('dev'));
      // The following two middlwares are NOT necessary because bodyParser includes them.
      // app.use(express.json());
      // app.use(express.urlencoded());
      app.use(express.methodOverride());
    
      app.use(express.cookieParser()); // read cookies (needed for auth)
      app.use(express.bodyParser()); // get information from html forms
      // required for passport
      app.use(express.session({ secret: 'SECRET' })); // session secret
      app.use(passport.initialize());
      app.use(passport.session()); // persistent login sessions
      app.use(flash()); // use connect-flash for flash messages stored in session
    
      app.use(app.router);
      app.use(require('stylus').middleware(path.join(__dirname, 'public')));
      app.use(express.static(path.join(__dirname, 'public')));
    });
    
    // ...
    

    【讨论】:

    • 从 Express 4.* 开始,官方中间件存储在单独的存储库中。例如,var session = require('express-session'); app.use(session({ secret: 'SECRET' }));github.com/senchalabs/connect
    【解决方案2】:

    如果您使用的是最新的 express (3.0) 用以下内容替换 cookie 解析器行:

    app.use(express.cookieParser("thissecretrocks"));

    为同样的错误为我工作!

    【讨论】:

      【解决方案3】:

      对于 4.0,这会有所改变。

      首先,您需要安装 express-session,然后,在您定义路由之前:

      // Authentication configuration
      app.use(session({
        resave: false,
        saveUninitialized: true,
        secret: 'bla bla bla' 
      }));
      

      您可以稍后执行 OAuth:

      // Passport
      app.use(passport.initialize());
      app.use(passport.session());
      
      passport.use(new TwitterStrategy({
         ...
      ));
      

      【讨论】:

        【解决方案4】:

        只需将express-session 添加到您的主 js 文件中即可。

        const session = require('express-session');
        // After you declare "app"
        app.use(session({ secret: 'melody hensley is my spirit animal' }));
        

        就像这些人为LinkedIn commit 做的那样。

        显然不要忘记安装express-session,所以npm install express-session 或将"express-session": "^1.15.3" 添加到你的package.json 中

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-18
          • 2015-08-14
          • 2020-08-02
          • 2017-10-19
          • 1970-01-01
          • 2015-10-13
          • 2020-01-19
          • 1970-01-01
          相关资源
          最近更新 更多