質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

2857閲覧

【Passport.js】ブラウザにcookieが保存されない。

webnakada

総合スコア7

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/01/27 02:05

【困っていること】
ブラウザに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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

webnakada

2021/01/28 04:03

ご回答ありがとうございます! 試してみると、 cookieのsamesiteプロパティ?にnoneとsecureを設定してくださいというエラーが出たので、 そうしてみます。secureはhttpsでないと使えないので、サーバーとブラウザ間をhttpsにしようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問