passport.jsのserializeUserとdeserializeUserが動かない
// // ユーザ情報をセッションへ保存
passport.serializeUser((id, done)=> {
console.log("serialize:" + id)
done(null, id);
});
//IDからユーザ情報を取得しreq.userに格納する
passport.deserializeUser(async (id, done) =>{
console.log("deserialize:"+ id);
const user=await User.findOne({_id:id});
done(null,user);
});
動作確認のためにconsole.logでIDの出力を試みたが一向に出力されず、解決に1週間以上要したため原因と解決策を記録する。
原因
私はpackage.jsonに以下のようなproxy設定を行なっていました。
"proxy": "http://localhost:5000"
にもかかわらず、、、
よくあるユーザ名とパスワードを入力する画面のログインボタンを押した時に、実行されるhandleSubmit関数内に以下のような記述をしてしまっていたのだ。
await axios.post("http://localhost:5000/api/auth/login");
つまり、「http://localhost:5000」 の部分が重複していることによってserializeUserとdeserializeUserの実行がスキップされていたのだ。axios内のパスを/api/auth/loginに変更することで無事に動作していることを確認できた。
まとめ
今回のバグは初歩的なミスであるが、passport.jsの基本的な実装は概ね合っていた為エラーが出力されず、バグの特定に非常に時間がかかった。もし実装は合っているはずなのにうまく動作しないと思ったら、初歩に立ち戻ってaxios内のパスやproxyの設定がうまくいっているかどうか確認してみてほしい。