node.js - 当请求包含授权 header 时阻止 Expressjs 创建 session ?

标签 node.js express connect passport.js

我有一个 API,可以使用请求是事务性的并具有 session 的浏览器或直接调用,例如。使用 curl,其中请求是原子的。浏览器请求必须首先进行身份验证,然后使用快速 session (connect.sid) 进行后续授权,直接 API 调用使用 header :Authorization: "SOMETOKEN"必须为每个请求发送。

我遇到的问题是,因为我使用同一个 Web 服务器来服务原子流量和事务流量,所以 Express 不必要地为每个 API 调用提供了一个 session 。每个响应都包含一个 Set-Cookie,所有这些 session 都填满了我的 session 存储。因此:当请求包含授权 header 时,如何防止 Express 在内存存储 (Redis) 中输入新的 session key ?

注意。我知道一个更经典的方法是拥有一个单独的 API 服务器和一个单独的 WEB 服务器,但为什么不在一台机器上同时运行两者呢?对我来说,区别在于 API 提供数据而 WEB 提供 View ,但除此之外,它们都是同一应用程序的一部分。我恰好也允许用户直接访问他们的数据,而不是强制他们使用我的界面。

快速配置

module.exports = function(app, exp, sessionStore, cookieParser, passport, flash) {

    app.configure(function(){
        // Templates
        app.set('views', ERNEST.root + '/server/views');
        app.set('view engine', 'jade');
        app.set('view options', { doctype : 'html', pretty : true });

        // Allow large files to be uploaded (default limit is 100mb)
        app.use(exp.limit('1000mb'));

        // Faux putting and deleting
        app.use(exp.methodOverride());

        // Static content
        app.use(exp.static(ERNEST.root + '/server'));
        app.use(exp.static(ERNEST.root + '/public'));

        // Handle favicon
        app.use(exp.favicon());

        // For uploads
        app.use(exp.bodyParser({keepExtensions: true}));

        // Configure cookie parsing
        if ( cookieParser ) app.use(cookieParser);
        else app.use(exp.cookieParser());

        // Where to store the session
        var session_options = { 'secret': "and she put them on the mantlepiece" };
        if ( sessionStore ) session_options.store = sessionStore;
        app.use(exp.session( session_options ));

        // Rememberance
        app.use( function (req, res, next) {
            if ( req.method == 'POST' && req.url == '/authenticate' ) {
                if ( req.body.rememberme === 'on' ) {
                    req.session.cookie.maxAge = 2592000000; // 30*24*60*60*1000 Rememeber 'me' for 30 days
                } else {
                    req.session.cookie.expires = false;
                }
            }
            next();
        });

        // PassportJS
        if ( passport ){
            app.use(flash());
            app.use(passport.initialize());
            app.use(passport.session());
        }
    });

};

示例路线

app.get('/status/past_week', MID.ensureAuthenticated, MID.markStart, function(req, res) {
    WEB.getStatus('week', function(err, statuses){
        if ( err ) res.send(500, err);
        else res.send(200, statuses);
    });
});

授权中间件

MID.ensureAuthenticated = function(req, res, next) {
  if ( req.isAuthenticated() ) return next();
  else {
        isAuthorised(req, function(err, authorised){
            if ( err ) return res.redirect('/');
            else if ( authorised ) return next();
            else return res.redirect('/');
        });
    }

    function isAuthorised(req, callback){
        var authHeader = req.headers.authorization;
        if ( authHeader ) {
            // Has header, verify it
            var unencoded = new Buffer(authHeader, 'base64').toString();
            var formatted = unencoded.toString().trim();
            ACCOUNT.verifyAuth(formatted, callback); // verifyAuth callbacks next() when successful
        } else callback(null, false); // No Authorised header
    }
};

最佳答案

试试这个:

var sessionMiddleware = exp.session( session_options );

app.use(function(req, res, next) {
  if (req.headers.authorization) {
    return next();
  }
  return sessionMiddleware(req, res, next);
});

关于node.js - 当请求包含授权 header 时阻止 Expressjs 创建 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21264911/

相关文章:

javascript - 如何测试调用多个其他函数的函数?

javascript - 带有 orm2 和分离模型文件的 Node Express

node.js - 如何更改快速静态目录?

c# - 实时连接 Rest API : Signing user in?

javascript - 如何在 Mocha 测试中要求相同的文件

javascript - 调用 require 不会返回相同的对象

javascript - 在 POST 正文中发送一个数组

authentication - 如何在 Sourcetree 中与 Github 建立基本连接

javascript - node.js 生成响应时出错。 TypeError : response. json 不是函数

javascript - 在 node.js 中读取缓冲区对象