nodejs/passport - 错误:OAuthStrategy需要会话支持

Spe*_*her 1 twitter oauth node.js twitter-oauth passport.js

我正在尝试使用护照模块在我的网络应用程序上设置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
Run Code Online (Sandbox Code Playgroud)

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

Error: OAuthStrategy requires session support. Did you forget app.use(express.session(...))?
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我这样做?

Eld*_*ell 10

对于 4.0,这有一点改变。

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

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

您可以稍后执行 OAuth 操作:

// Passport
app.use(passport.initialize());
app.use(passport.session());

passport.use(new TwitterStrategy({
   ...
));
Run Code Online (Sandbox Code Playgroud)


bnu*_*ero 5

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

// ...
Run Code Online (Sandbox Code Playgroud)

  • 从Express 4.*开始,官方中间件存储在单独的存储库中.例如,`var session = require('express-session'); app.use(session({secret:'SECRET'}));`https://github.com/senchalabs/connect (6认同)