Node.js 如何从basicAuth(Express)注销

Node.js 如何从basicAuth(Express)注销,node.js,express,basic-authentication,Node.js,Express,Basic Authentication,我正在尝试使用express设置web服务器。要访问此服务器,用户必须进行身份验证,为此,我使用Express提供的basicAuth()中间件。它工作完美,除了我不知道如何注销一旦我登录!我必须关闭浏览器才能断开连接,但我希望有一个“断开连接”页面,该页面将重定向到“登录”页面(这一页面具有用于登录的可怕表单…) 有人有主意吗 预支谢谢 PS:我为我可怜的英语道歉:)Express'basicAuth使用HTTP基本身份验证,其实现不需要HTML页面、cookie或会话ID。它的主要缺点是不安

我正在尝试使用express设置web服务器。要访问此服务器,用户必须进行身份验证,为此,我使用Express提供的basicAuth()中间件。它工作完美,除了我不知道如何注销一旦我登录!我必须关闭浏览器才能断开连接,但我希望有一个“断开连接”页面,该页面将重定向到“登录”页面(这一页面具有用于登录的可怕表单…)

有人有主意吗

预支谢谢


PS:我为我可怜的英语道歉:)

Express'basicAuth使用HTTP基本身份验证,其实现不需要HTML页面、cookie或会话ID。它的主要缺点是不安全,而且,我们在这里关注的是,规范中没有服务器指示浏览器注销的机制

express.basicAuth()调用需要(blah-blah/connect/lib/utils).unauthorized(),它发送一个401状态,标题为“WWW-Authenticate:Basic realm=“…””。浏览器处理身份验证窗口,并从那时起发送一个标题,如“Authorization:Basic YmFzaWM6YmFzaWM=”,其中包含用户名和密码

(express.basicAuth不安全,尤其是在HTTP上,因为您可以使用

new Buffer('YmFzaWM6YmFzaWM=' , 'base64').toString() 
其中给出了basic:在本例中为basic。)

我们的问题是HTTP规范没有提供停止发送该头的方法。HTTPS的一个解决方法是将用户重定向到同一域上具有错误凭据的URL

我用于ExpressV3的HTTP变通方法可以与app.use(Express.basicAuth(…)一起使用。我发现这比其他需要在每个安全路由中调用中间件的解决方案更容易使用,例如app.get('/secure',checkAuth,function(req,res){…})

下面是一个工作示例

var express = require('express'),
    http = require('http'),
    app = express();

app.use(express.favicon()); // prevent interference during test
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'winter is coming' }));

app.use(function (req, res, next) {
  if (!req.session.authStatus || 'loggedOut' === req.session.authStatus) {
    req.session.authStatus = 'loggingIn';

    // cause Express to issue 401 status so browser asks for authentication
    req.user = false;
    req.remoteUser = false;
    if (req.headers && req.headers.authorization) { delete req.headers.authorization; }
  }
  next();
});
app.use(express.basicAuth(function(user, pass, callback) {
  callback(null, user === 'basic' && pass === 'basic');
}, '***** Enter user= basic & password= basic'));
app.use(function (req, res, next) {
  req.session.authStatus = 'loggedIn';
  next();
});

app.use(app.router);
app.get('/secure', function (req, res) {
  res.send([
    'You are on a secured page.',
    '<br>',
    '<a href="./secure">Refresh this page without having to log in again.</a>',
    '&lt;br/>',
    '<a href="./logout">Log out.</a>'
  ].join(''));
});
app.get('/logout', function (req, res) {
  delete req.session.authStatus;
  res.send([
    'You are now logged out.',
    '&lt;br/>',
    '<a href="./secure">Return to the secure page. You will have to log in again.</a>',
  ].join(''));
});

http.createServer(app).listen(3000, function(){
  console.log('Express server listening on port 3000. Point browser to route /secure');
});
var express=require('express'),
http=require('http'),
app=express();
app.use(express.favicon());//防止测试过程中的干扰
app.use(express.bodyParser());
use(express.cookieParser());
使用(express.session({secret:'冬天来了'}));
应用程序使用(功能(请求、恢复、下一步){
如果(!req.session.authStatus | |'loggedOut'==req.session.authStatus){
req.session.authStatus='logginging';
//使Express发出401状态,以便浏览器请求身份验证
req.user=false;
req.remoteUser=false;
if(req.headers&&req.headers.authorization){delete req.headers.authorization;}
}
next();
});
app.use(express.basicAuth)(函数(用户、传递、回调){
回调(null,user==='basic'&&pass=='basic');
},“****输入user=basic和password=basic”);
应用程序使用(功能(请求、恢复、下一步){
req.session.authStatus='loggedIn';
next();
});
应用程序使用(应用程序路由器);
app.get('/secure',函数(req,res){
res.send([
“你在安全页面上。”,
“br>”,
'',
“br/>”,
''
].加入(“”);
});
app.get('/logout',函数(req,res){
删除req.session.authStatus;
res.send([
“您现在已注销。”,
“br/>”,
'',
].加入(“”);
});
http.createServer(app).listen(3000,函数(){
console.log('Express server监听端口3000。将浏览器指向route/secure');
});

另外,您的英语非常好。

对于express.js 4和basicAuth,您可以使用以下方法:

app.get('/logout', function (req, res) {
    res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
    return res.sendStatus(401);
});

添加到wyllman中,
401
代码是
Unauthorized
。 您只需使用
res.status(401.send('Logged out')响应即可。

app.get('/logout',函数(req,res){
res.status(401.send)(“注销”)
//或res.status(401).end(),如果您不想发送任何消息
});

我已经确认,将用户重定向到一个带有http代码401的/logout页面和带有
元素链接的html的/login页面是有效的。

问题有一个注销示例,最简单的答案是“在注销时更新req.session变量”。请查看passport模块和passport local。它通过调用req.logout()使注销变得容易。Passport还可以方便地在将来添加其他身份验证方法,如果您想要,请快速提问,下一步是什么();功能是什么?