[解決済み] 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);
関連
-
[解決済み】MongoClient v3.0使用時、db.collectionは関数ではない
-
[解決済み】ブロックスコープの宣言は、ストリクトモード以外ではまだサポートされていません。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】Heroku + node.jsのエラー(Webプロセスが起動後60秒以内に$PORTにバインドできなかった)。
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] Node.jsを使用してディレクトリが存在しない場合に作成する方法
-
[解決済み] Node.jsで "Cannot find module "エラーを解決するにはどうしたらいいですか?
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「npm install」と「npm rebuild」の違いとは?
-
webpack ENOENTソリューションの起動
-
[解決済み] bodyParser は非推奨です express 4
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] Heroku "状態が起動から停止に変更されました SIGTERMで全プロセスを停止"
-
[解決済み] nodejsでfindAllのソート順を続編にする
-
[解決済み] エラーメッセージ MongoError: bad auth URI 文字列で認証に失敗しました。
-
[解決済み] "app.use(express.cookieSession())" に "secret" オプションが必要です。