【困っていること】
ブラウザにcookieが保存されない。
ブラウザからサーバーにcookieが送り返されず、セッションが維持できない。
passportjsで認証機能を作ろうとしており、サインイン機能とログイン機能はできました。ユーザー登録して、そのユーザー名とパスワードでログインしたときのレスポンスのヘッダーにset-cookieがある(Networkタブで確認したところ、Set-cookie:connect.sid=に続けて文字列があります。)のですが、chromeの検証ツールでApplicationタブをみてもcookieが保存されていません。
どなたか対応策など教えていただければ幸いです。よろしくお願いいたします。
【試したこと、確認したこと】
・chromeのcookieの設定が、「シークレット モードでサードパーティの Cookie をブロックする」になっていることを確認。
もちろん、実行環境はシークレットモードではありません。
.axiosのオプションのwithCredentials: trueにした。
・passport-sessionのcookieの設定をhttpOnly:falseにした。
→ブラウザのコンソールでdocument.cookieと入力しenterを押しても””が返ってくる。
・バックエンドのcorsプラグインのoriginに"http://localhost:3000"に編集。
【環境】
フロント:react typescript
バックエンド:express
データベース:mysql
【コード】
バックエンド
Javascript
1const express = require("express"); 2const bodyparser = require("body-parser"); 3const app = express(); 4const mysql = require("mysql"); 5const cors = require("cors"); 6const port = 9000; 7const bcrypt = require("bcrypt"); 8const saltRounds = 10; 9 10const db = mysql.createPool({ 11 host: "***********************", 12 user: "guestuser", 13 port: 3306, 14 password: "************", 15 database: "training", 16}); 17 18app.use(cors()); 19app.use(express.json()); 20app.use(bodyparser.json({ type: "application/json" })); 21app.use(bodyparser.urlencoded({ extended: true })); 22 23app.get("/api/get/training", (req, res) => { 24 const sqlSelect = "SELECT * FROM training order by tr_id"; 25 db.query(sqlSelect, (err, result) => { 26 if (err) console.log(err); 27 res.send(result); 28 }); 29}); 30 31app.delete("/api/delete/:id", (req, res) => { 32 const id = req.params.id; 33 const sqlDelete = "DELETE FROM trainingrecord WHERE id = ?;"; 34 db.query(sqlDelete, [id], (err, result) => { 35 if (err) console.log(err); 36 }); 37}); 38 39app.get("/api/get/trainingrecord", (req, res) => { 40 const { dt } = req.query; 41 const sqlSelect = `SELECT * FROM trainingrecord join training on trainingrecord.trainingid = training.tr_id where dt = "${dt}" order by createdAt`; 42 db.query(sqlSelect, (err, result) => { 43 if (err) console.log(err); 44 res.send(result); 45 }); 46}); 47 48app.get("/api/get/trainingrecord/graph", (req, res) => { 49 const { start, end } = req.query; 50 const sqlSelect = `SELECT * FROM trainingrecord join training on trainingrecord.trainingid = training.tr_id where dt <= "${end}" and dt >= "${start}" order by createdAt`; 51 db.query(sqlSelect, (err, result) => { 52 if (err) console.log(err); 53 res.send(result); 54 }); 55}); 56 57app.get("/api/get/trainingrecord/distinct/", (req, res) => { 58 // const { dt } = req.query; 59 const sqlSelect = `SELECT DISTINCT dt FROM trainingrecord order by dt desc limit 5`; 60 db.query(sqlSelect, (err, result) => { 61 if (err) console.log(err); 62 res.send(result); 63 }); 64}); 65 66app.post("/api/insert/:userid/", (req, res) => { 67 const userid = req.params.userid; 68 const { dt, trainingid, count } = req.body; 69 const sqlInsert = 70 "INSERT trainingrecord (userid,dt,trainingid,count) values (?,?,?,?);"; 71 db.query(sqlInsert, [userid, dt, trainingid, count], (err, result) => { 72 if (err) console.log(err); 73 res.send(result); 74 }); 75}); 76 77//サインイン 78app.post("/signin/", (req, res) => { 79 const { username, password } = req.body; 80 const sqlInsert = "INSERT user (name,password) values (?,?);"; 81 bcrypt.hash(password, saltRounds, (err, hash) => { 82 if (err) return console.log(err); 83 db.query(sqlInsert, [username, hash], (err, result) => { 84 if (err) { 85 console.log(err); 86 res.send(err); 87 return; 88 } 89 res.send(result); 90 }); 91 }); 92}); 93 94//認証機能など 95 96const passport = require("passport"); 97const Strategy = require("passport-local").Strategy; 98const session = require("express-session"); 99const cookiesession = require("cookie-session"); 100const cookieParser = require("cookie-parser"); 101 102app.use(cookieParser()); 103app.use(cookiesession()); 104 105app.use( 106 session({ 107 secret: "testing", 108 resave: false, 109 saveUninitialized: true, 110 }) 111); 112app.use(passport.initialize()); 113app.use( 114 passport.session({ 115 cookie: { 116 httpOnly: false, 117 }, 118 }) 119); 120 121passport.use( 122 new Strategy( 123 { 124 usernameField: "username", 125 passwordField: "password", 126 }, 127 (username, password, done) => { 128 db.query( 129 `select * from user where name = '${username}';`, 130 (err, user) => { 131 if (err) { 132 return done(err); 133 } 134 if (!user) { 135 return done(null, false); 136 } 137 bcrypt.compare(password, user[0].password, (err, result) => { 138 if (err) return console.log(err); 139 console.log(result); 140 done(null, user); 141 }); 142 } 143 ); 144 } 145 ) 146); 147 148passport.serializeUser(function (user, done) { 149 console.log("serializeUser"); 150 done(null, user[0].id); 151}); 152 153passport.deserializeUser(function (username, done) { 154 console.log("deserializeUser"); 155 done(null, { name: username }); 156}); 157 158app.post( 159 "/login/", 160 passport.authenticate("local", { 161 session: true, 162 }), 163 (req, res) => { 164 const uid = req.user[0].id; 165 const sid = req.sessionID; 166 const sqlInsert = "INSERT session (sid,uid) values (?,?);"; 167 db.query(sqlInsert, [sid, uid], (err, result) => { 168 if (err) console.log(err); 169 res.send(result); 170 }); 171 res.send(req.user); 172 } 173); 174 175app.get("/api/getuser", (res, req) => { 176 console.log(req.session, "session"); 177 console.log(req.session.Session, "Session"); 178 console.log(req.session.Session.cookie, "Session.cookie"); 179}); 180 181//ポートリッスン 182app.listen(port, () => { 183 console.log(`listening at port:${port}`); 184}); 185
フロント(axiosの部分を抜粋)
JavaScript
1 axios 2 .post('/login/', { 3 password, 4 username, 5 }) 6 .then((response) => { 7 console.log(response.data[0].id); 8 setUserId(response.data[0].id); 9 }) 10 .catch((err) => { 11 console.log(err); 12 }); 13
あなたの回答
tips
プレビュー