27

このようにログインするときは、「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();
});
4

3 に答える 3

37

私はあなたとまったく同じ問題を抱えていました。次のコードは私にとってはうまくいきます:

app.post("/login", passport.authenticate('local',
    { failureRedirect: '/login',
      failureFlash: true }), function(req, res) {
        if (req.body.remember) {
          req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // Cookie expires after 30 days
        } else {
          req.session.cookie.expires = false; // Cookie expires at end of session
        }
      res.redirect('/');
});
于 2014-03-11T22:05:43.663 に答える
6

Jared Hanson によって書かれた、Remember Me 機能を追加するための Passport 戦略があります。

https://github.com/jaredhanson/passport-remember-me

これは、次の開始時に消費されるすべてのセッション中に一意のremember-meトークンを発行することで機能します(将来の使用のために無効にします)。結果として、これはより安全なソリューションになる可能性があります.

于 2015-07-14T13:55:13.520 に答える
2

app.use(express.bodyParser())依存しているため、ミドルウェアの上に配置されていることを確認してくださいreq.body.rememberme

于 2013-10-04T02:36:10.060 に答える