質問の概要
Express + nginxを使って開発をしているのですが、ログイン処理時にセッションが意図したように動作してくれません。
ログインAPIへの通信はうまくいっているようでログインしたユーザの情報が返ってきて特にエラーも出ないのですが、その時にブラウザにCookieがセットされていないようです。(レスポンスにSet-Cookieがそもそもない様子)
色々と調べてみたのですが自力での解決が難しそうでご質問させていただきました。どうぞよろしくお願いいたします。
構成など
React / nginx / express / MySQL
フロント側(React)とAPIは別のオリジン
JWTではなくCookieを使ったサーバ側でのセッション管理
expressではexpress-session、ログインの認証にpassport.jsを使用
状況
- CORSの設定は対応済、フロント側からfetchでログインのAPIに接続し結果も問題なく受け取れる
- Cookieはhttp-only, secure, Same-site=Noneとなるように設定、フロントおよびAPIはどちらもSSLを設定している
- Chromeの開発者ツールでログインのAPIをPOSTした時のレスポンスを確認するとヘッダにSet-Cookieが見当たらない
試してみたこと
- こちらの記事に書かれているような事象に近いのかなと思い
app.set("trust proxy", 1);
を設定してみましたが動作は変わらずでした。
https://t-cr.jp/memo/1c317a5b828d92220
-
nginx側でX-Forwarded-Forの設定が必要なのかと思い
proxy_set_header X-Forwarded-For $remote_addr;
と追記してみましたがこちらも動作変わらずでした。他にも必要な記述があるのかなとおもったのですがnginxの知識が足りておらずどういう設定が必要なのかを調べることができませんでした。 -
ためしにログインのAPIをPOSTした際に適当なキー/値でCookieを設定してみたところこちらはうまくブラウザに保存されたのでセッション絡みのCookieがうまくいっていないようです
ソースコード
app.js
javascript
1const createError = require('http-errors'); 2const express = require('express'); 3const session = require('express-session') 4const cookieParser = require('cookie-parser'); 5const logger = require('morgan'); 6const cors = require('cors') 7 8//generate app 9const app = express(); 10app.set('trust proxy', 1); 11 12//set env 13require('dotenv').config(); 14 15//set middleware 16app.use(logger('dev')); 17app.use(cors({ 18 origin: process.env.CLIENTORIGIN, 19 credentials: true, 20 optionsSuccessStatus: 200, 21})) 22app.use(express.json()); 23app.use(express.urlencoded({ extended: false })); 24app.use(cookieParser()); 25app.use(session({ 26 secret: 'node_app_template', 27 resave: true, 28 saveUninitialized: false, 29 proxy: true, 30 cookie: { 31 httpOnly: true, 32 maxAge: 60000, 33 secure: true, 34 sameSite: 'none', 35 } 36})) 37...
login.js(API部分のソース)
javascript
1var express = require('express'); 2var router = express.Router(); 3const passport = require('../auth') 4 5router.use(passport.initialize()) 6router.use(passport.session()) 7 8router.post('/login', 9 passport.authenticate('local'), 10 (req, res) => { 11 // この記載を試しにコメントインするとこのCookieは問題なく保存される 12 // res.cookie('testCookie', 'testValue', { 13 // httpOnly: true, 14 // maxAge: 60000, 15 // secure: true, 16 // sameSite: 'none', 17 // }) 18 19 res.json( {result: req.user }) 20 } 21) 22 23router.post('/logout', (req, res) => { 24 // req.session.passport.user = undefined; 25 req.logout(); 26 res.json({ result: req.user }) 27}) 28 29module.exports = router;
nginx.conf
events{ } http{ server { listen 80 default; server_name localhost; } server { listen 443 ssl; location / { proxy_pass http://172.30.0.2:3000; proxy_set_header X-Forwarded-For $remote_addr; } ssl_certificate /etc/certs/localhost.pem; ssl_certificate_key /etc/certs/localhost-key.pem; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。