2013-05-03 8 views
10

私はexpressを使用してWebサーバーを設定しようとしています。このサーバーにアクセスするには、ユーザーが認証する必要があり、そのためにExpressで提供されるbasicAuth()ミドルウェアを使用します。一度ログインすればログアウトする方法はわかりませんが、完璧に動作します!私はブラウザを閉じて接続を切断する必要がありますが、代わりに "ログイン"ページ(これはログインに使用された厄介なフォームがあります)に向けてリダイレクトする "切断"ページが必要です。basicAuth(Express)からログアウトするには

アイデアはありますか?事前あたり

おかげ

PS:私は私の哀れな英語について謝罪:)

+0

[このStackOverflowの](http://stackoverflow.com/questions/7990890/how-to-implement-login-authを-in-node-js)questionにログアウトの例があります。最も単純な答えは、 "ログアウト時にreq.session変数を更新する"です。 –

+0

パスポートhttp://passportjs.org/モジュールとパスポートローカルhttps://github.com/jaredhanson/passport-localをご覧ください。 req.logout()を呼び出すと、簡単にログアウトできます。また、Passportを使用すると、将来的に他の認証方法を簡単に追加することができます。 – Noah

答えて

21

ExpressのBASICAUTHは、そのインプリメンテーションHTMLページ、クッキーやセッションIDを必要としないHTTP基本認証を使用しています。その主な欠点はセキュリティで保護されていないことです。ここでは、サーバーがログアウトするようにブラウザに指示する仕組みはありません。

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

(express.basicAuthは、ユーザー名を取得することができるので、特にHTTPを介して、セキュアではありません。基本的な与え

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

とパスワードを:。基本的なこのケースでは)

私たちの問題があります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'); 
}); 

P.S.あなたの英語は優れています。 express.js 4とBASICAUTHについては

+0

ちょっと、簡単な質問です。関数は何ですか? –

+0

http://stackoverflow.com/questions/10695629/node-js-express-next – Domenic

10

、あなたがこの方法で使用することができます:

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