12

Express を使用して Web サーバーをセットアップしようとしています。このサーバーにアクセスするには、ユーザーが認証を行う必要があります。そのために、Express が提供する basicAuth() ミドルウェアを使用します。ログインしたらログアウトする方法がわからないことを除けば、完全に機能します。ブラウザを閉じて切断する必要がありますが、代わりに「ログイン」ページにリダイレクトする「切断」ページが必要です(これはログインに使用される恐ろしいフォームです...)。

誰にもアイデアはありますか?

事前に感謝します

PS : 哀れな英語で申し訳ありません:)

4

4 に答える 4

24

Express の basicAuth は、実装に HTML ページ、Cookie、セッション ID を必要としない HTTP 基本認証を使用します。その主な欠点は安全ではないことであり、ここで懸念されるのは、サーバーがブラウザーにログアウトするように指示するメカニズムが仕様にないことです。

express.basicAuth() は require(blah-blah/connect/lib/utils).unauthorized() を呼び出し、ヘッダー 'WWW-Authenticate: Basic realm="..."' で 401 ステータスを送信します。ブラウザーは認証ウィンドウを処理し、それ以降、ユーザー名とパスワードを含む「Authorization: Basic YmFzaWM6YmFzaWM=」などのヘッダーを送信します。

(express.basicAuth は、特に HTTP では安全ではありません。

new Buffer('YmFzaWM6YmFzaWM=' , 'base64').toString() 

この場合は basic:basic になります。)

私たちの問題は、HTTP 仕様がそのヘッダーの送信を停止する方法を提供していないことです。HTTPS の回避策は、間違った認証情報を持つ同じドメインの URL にユーザーをリダイレクトすることです。

Express V3 で使用する 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');
});

PS あなたの英語は素晴らしいです。

于 2013-06-18T14:58:25.427 に答える
11

express.js 4 および basicAuth の場合、次のメソッドを使用できます。

app.get('/logout', function (req, res) {
    res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
    return res.sendStatus(401);
});
于 2015-04-16T21:09:35.920 に答える