簡體   English   中英

僅通過Express框架對某些URL使用HTTP基本身份驗證

[英]Using HTTP basic auth for certain URLs only with Express framework

我有一個使用Express框架和http-auth模塊設計的node.js應用程序,如下所示:

var auth = require('http-auth');
var express = require('express');
// ...
var mywebapp = express();
// ...
if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(auth.connect(basic));
}

mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// ...

但是,我不想保護/js/css目錄下的可用資產。 這是我嘗試做的:

if (usebasicauth) {
  var basic = auth.basic({realm:"MyRealm", file:"/srv/config/passwd"});
  mywebapp.use(function(req, res, next) {
    if (/^\/(css|js)/.test(req.url)) {
      next();
    }
    else {
      auth.connect(basic);
    }
  });
}

嘗試訪問/css/js下的URL可以正常工作; 但是,其他URL永遠不會加載。

如何使其他URL正常工作?

mywebapp.use的順序很重要。 如果您首先擁有mywebapp.use(auth.connect(basic)); 那么它將用於每個請求,但是如果您更改順序,它將傳遞靜態信息,並且僅用於其后的任何內容。

中間件功能按其添加順序進行處理。

所以下面應該做你想要的。

// no auth for statics
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));
// auth reguired from here 
mywebapp.use(auth.connect(basic));

如果放置mywebapp.use(auth.connect(basic)); 在express.static以上,它也會要求auth身份驗證。

// auth reguired from here 
mywebapp.use(auth.connect(basic));
// auth required for statics as well
mywebapp.use('/js', express.static(__dirname + '/files/js'));
mywebapp.use('/css', express.static(__dirname + '/files/css'));

您也可以做類似的事情https://gist.github.com/gevorg/7168d5f02c1ca5362b2a#file-specific-path-js

// Express module.
var express = require('express');

// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
    realm: "Simon Area.",
    file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});

// Application setup.
var app = express();
app.use(function(req, res, next) {
    if ('/specific/path' === req.path) {
        next();
    } else {
        (auth.connect(basic))(req, res, next);
    }
});

// Setup route.
app.get('/', function(req, res){
  res.send("Hello from express - " + req.user + "!");
});

// Setup guest route.
app.get('/specific/path', function(req, res){
  res.send("Hello from express - guest!");
});

// Start server.
app.listen(1337);

不能接受這個問題的答案,因為路線順序很重要!

更好的方法是將basic-auth作為路由定義的第二個參數傳遞:

app.get('/admin', auth.connect(basic), (req, res) => {
    res.send(`Hello from admin area - ${req.user}!`);
});

要么

app.use('/admin', auth.connect(basic), myCustomRoute);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM