1. ホーム
  2. node.js

[解決済み] passport.jsを使ったnode.jsでの認証後の前ページへのリダイレクトについて

2022-10-07 07:53:06

質問

私はnode.js、expressとpassport.jsを使用してログインメカニズムを確立しようとしています。ログイン自体は非常にうまく機能し、セッションはredisでうまく保存されますが、私は認証のためにプロンプトが表示される前に、ユーザーを開始した場所にリダイレクトすることにいくつかの問題があります。

例: ユーザーがリンクをたどる http://localhost:3000/hidden にリダイレクトされます。 http://localhost:3000/login にリダイレクトされるようにしたいのですが、その後にまた http://localhost:3000/hidden .

この目的は、ユーザーがログインする必要のあるページにランダムにアクセスした場合、認証情報を提供する /login サイトにリダイレクトされ、その後、以前にアクセスしようとしたサイトにリダイレクトされることです。

以下は私のログインの投稿です。

app.post('/login', function (req, res, next) {
    passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err)
        } else if (!user) { 
            console.log('message: ' + info.message);
            return res.redirect('/login') 
        } else {
            req.logIn(user, function (err) {
                if (err) {
                    return next(err);
                }
                return next(); // <-? Is this line right?
            });
        }
    })(req, res, next);
});

そして、ここに私の ensureAuthenticated メソッド

function ensureAuthenticated (req, res, next) {
  if (req.isAuthenticated()) { 
      return next();
  }
  res.redirect('/login');
}

にフックして /hidden ページにフックします。

app.get('/hidden', ensureAuthenticated, function(req, res){
    res.render('hidden', { title: 'hidden page' });
});

ログインサイトのhtml出力は非常にシンプルです。

<form method="post" action="/login">

  <div id="username">
    <label>Username:</label>
    <input type="text" value="bob" name="username">
  </div>

  <div id="password">
    <label>Password:</label>
    <input type="password" value="secret" name="password">
  </div>

  <div id="info"></div>
    <div id="submit">
    <input type="submit" value="submit">
  </div>

</form>

どのように解決するのですか?

パスポートのことはよくわからないのですが、私はこうしています。

私はミドルウェアを app.get('/account', auth.restrict, routes.account) を設定するミドルウェアがあります。 redirectTo をセットして、/loginにリダイレクトしています。

auth.restrict = function(req, res, next){
    if (!req.session.userid) {
        req.session.redirectTo = '/account';
        res.redirect('/login');
    } else {
        next();
    }
};

次に routes.login.post 以下のようにしています。

var redirectTo = req.session.redirectTo || '/';
delete req.session.redirectTo;
// is authenticated ?
res.redirect(redirectTo);