ユーザーの認証を制御する簡単なシステムを作成しています。登録ユーザーのみがサイトにアクセスできます。認証されていない場合は、ログイン ページにリダイレクトされます。
簡単に言えば、このコントロールを作成するためにミドルウェアを使用しています。
私の問題は、リダイレクトの条件が有効な場合、これが起こらないことです!
// Routes
module.exports = function(app) {
app.use(function(req, res, next) {
console.log(req.url);
if (typeof(res.session) == 'undefined' && req.url != '/users/login') {
console.log('redirect');
res.redirect('/users/login');
} else {
console.log('no redirect');
next();
}
});
app.get('/', routes.site.index);
app.all('/users/login', routes.user.login);
};
明らかに、頑丈なコンソールは次のとおりです。
/
redirect
/users/login
no redirect
そして、ページは無期限にロードされています...
助言がありますか?
ありがとう!
PS: スペルが間違っていたらごめんなさい、Google が助けてくれました!
@ - - - - - - - - - - 編集:
Auth の管理には Passport を使用することにしました。
問題は 1 つだけです。アプリのルートを別のファイルで実行しています。
app.js
// Auth
var passport = require('passport'), strategy = require('passport-local').Strategy;
passport.use(new strategy(function(username, password, done) {
var user = require('./db')('user');
user.findOne({username: username}, function(err, user) {
if (err) return done(err);
if (!user) return done(null, false);
if (!user.validPassword(password)) return done(null, false);
return done(null, user);
});
}));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
var user = require('./db')('user');
user.findOne(id, function(err, user) {
done(err, user);
});
});
// End Auth
require('./routes')(app, passport);
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(passport.initialize());
app.use(passport.session());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
ルート/index.js
// Routes
module.exports = function(app, passport) {
app.get('/', passport.authenticate('local', {successRedirect: '/', failureRedirect: '/login' }), routes.site.index);
app.all('/login', routes.user.login);
};
ルート/user.js
exports.login = function(req, res, next) {
switch (req.method) {
default:
case 'GET':
res.render('user/login', {title: 'Login'});
break;
case 'POST':
/*passport.authenticate('local', function(err, user, info) {
res.json([user, info]);
});
*/
break;
}
};
ログイン ページへのリダイレクトは正常に機能しますが、別のファイルでルートを管理することになるため、user.js ファイルでコールバック コントロールを処理できるように変数のパスポートを維持せずにはいられません。
アイデア?ありがとう!!!