やりたいこと
passport
+ passport-facebook
+ cookie-session
で
stateパラメーターによってCSRF対策をしたいです。
state
自体をcookie
に入れるのではなく、sessionID
のみを保存する方法で実現したいです。
(しかしsessionID
の取得方法や利用方法が分かってない...という状態です。)
現在の状態
passport
とpassport-facebook
で、FB認証開発中です。
OAuth2.0はCSRF脆弱性があるので、stateパラメータで検証する必要があります。
参考 : Node.jsでFacebookのOAuth2.0認証
// 引用 router.get('/', (req, res, next) => { if (!req.session.state) { var random = Math.random().toString(); req.session.state = random } passport.authenticate('facebook', { state: req.session.state })(req, res, next); }); router.get('/callback', (req, res, next) => { if (!req.session.state) { return res.status(400).send({err: 'no state parameter'}); } // CSRF verification if (req.query.state !== req.session.state) { return res.status(400).send({err: 'invalid state parameter'}); } passport.authenticate('facebook', { failureRedirect: '/', successRedirect: '/me' })(req, res, next); }); module.exports = router;
困っていること
上記ではexpress-sessionを利用してますが、本番では使えません。
Warning The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.(express-session)
代わりにcookie-sessionを使い、
セキュリティの考慮し、state
でなくsessionID
をcookie
に入れる方法を模索してますが、
そもそもsessionID
がどのように取れるかドキュメントから掴めませんでした。
router.get('/', (req, res, next) => { if(!req.session.state) { const random = Math.random().toString(); req.session.state = random; } passport.authenticate('facebook', { scope: ['email'], state: req.session.state, })(req,res,next); }; router.get('/callback', (req, res, next) => { if (!req.session.state) { return res.status(400).send({err: 'no state parameter'}); } // CSRF verification if (req.query.state !== req.session.state) { return res.status(400).send({err: 'invalid state parameter'}); } passport.authenticate('facebook', { failureRedirect: '/', successRedirect: '/me' })(req, res, next); res.redirect(`/facebook/signin?*********`); };
あなたの回答
tips
プレビュー