このようにログインするときは、「Remember Me」チェックボックスが必要です。そして、パスポートを使用する前にミドルウェアを追加します
app.use(function(req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = 1000 * 60 * 3;
} else {
req.session.cookie.expires = false;
}
}
next();
});
app.use(passport.initialize());
app.use(passport.session());
が true の場合はログインできず、 falsereq.body.rememberme
の場合はユーザーが記憶されreq.body.rememberme
ます。connect-ensure-login も試しましたが、まだ間違っています。
もう 1 つの質問: データベース内の Cookie をいつ、どのように削除すればよいですか?
:)
その他のコードはパスポートガイドと全く同じ
ルート:
app.get('/', passport.authenticate('local', {
failureRedirect: '/login'
}), function(req, res) {
res.redirect('/user/home');
});
app.post('/login', passport.authenticate('local', {
failureRedirect: '/login'
}), function(req, res) {
res.redirect('/user/home');
});
セッション:
passport.serializeUser(function(user, done) {
var CreateAccessToken = function() {
var token = user.GenerateSalt();
User.findOne({
accessToken: token
}, function(err, existingUser) {
if (err)
return done(err);
if (existingUser) {
CreateAccessToken();
} else {
user.set('accessToken', token);
user.save(function(err) {
if (err)
return done(err);
return done(null, user.get('accessToken'));
})
}
});
};
if (user._id)
CreateAccessToken();
});
passport.deserializeUser(function(token, done) {
User.findOne({
accessToken: token
}, function(err, user) {
if (err)
return done(err);
return done(err, user);
});
});
そして戦略:
passport.use(new LocalStrategy(function(userId, password, done) {
User.findOne().or([{
username: userId
}, {
email: userId
}]).exec(function(err, user) {
if (err)
return done(err);
if (!user) {
return done(null, false, {
message: 'Invalid password or username'
});
}
if (user.Authenticate(password)) {
return done(null, user);
} else {
return done(null, false, {
message: 'Invalid password or username'
});
}
});
}));
Express は、ハッシュ値が変更された場合にのみ Cookie を更新することに気付きました。ミドルウェアのコードを修正しました
app.use(function(req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = 1000 * 60 * 3;
req.session._garbage = Date();
req.session.touch();
} else {
req.session.cookie.expires = false;
}
}
next();
});
「Remember Me」でログインできるようになりましたが、Ubuntu の chromium と firefox でしか機能しません。Win7 と Android の chrome と firefox の [Remember Me] チェックボックスを使用してもログインできません。
win7 の chrome で "/login" に POST するときに応答ヘッダーを確認したところ、Ubuntu と同じ "Set-Cookie" フィールドがありましたが、なぜ機能しないのですか?
時間の同期が取れていないので、追加の時間フィールドを投稿します。
$('#login').ajaxForm({
beforeSubmit: function(arr, $form, option) {
arr.push({
name: '__time',
value: (new Date()).toGMTString()
});
}
});
および「RememberMe」ミドルウェア:
app.use(function(req, res, next) {
if (req.method == 'POST' && req.url == '/login') {
if (req.body.rememberme) {
req.session.cookie.maxAge = moment(req.body.__time).add('m', 3) - moment();
req.session._garbage = Date();
req.session.touch();
} else {
req.session.cookie.expires = false;
}
}
next();
});