node.js セッション ログイン状態を持続する
いっぺんログインしたクライアントは2回め以降ログインせんでもいけるようにしてーと言われたので調べた
(のを書いてなかったみたいなので書いとく。1年前のやつですが今んとこまだ使えてます)
セッションを定義して、サーバを起動する(日本語変かもー)
//CORSを許可する const cors = require('cors'); app.use(cors({ origin: true, credentials: true })); //セッション定義 const session = require('express-session'); var sess = { secret: 'keyboard cat', resave: false, saveUninitialized: false, cookie: { maxAge: 24 * 60 * 60 * 1000, //1日有効 sameSite: 'none', secure: true //←httpsのときしかクッキーを通さないモード // これをtrueにしておかないとchromeでエラーになる } }; app.use(session(sess)); //session(cookie)を使うためにhttpsにする const fs = require('fs'); const options = { key: fs.readFileSync('xxx.key'), //セキュリティ証明書 cert: fs.readFileSync('xxx.crt') //KEYファイル }; const https = require('https'); const server = https.createServer(options, app); server.listen(3000, () => { console.log('https server listening port 3000') });
セッションって、クッキー使ってやるのねー。しらんかったー(^^;
クライアント側、ログイン要求。こんな感じで。
data.name = "ログイン名"; const res = await fetch("https://localhost:3000/login", { method: 'POST', body: JSON.stringify(data), headers: {'Content-Type': 'application/json'}, credentials: 'include', mode: 'cors' });
サーバ側、ログイン受信処理
router.post('/login', async (req, res, next) => { //セッションにセット req.session.login = { user_name: req.body.name }; res.end(); }
サーバ側、以降、必ずログイン名がくっついて来る
router.post('/nanka_suru', async (req, res, next) => { if (req.session != undefined && req.session.login != undefined) console.log(req.session.login.user_name); //ログイン名 res.end(); });
ログアウトのときは、無効な値をセットしておけばよい
以下のようにしておけば、次に nanka_suru が呼ばれたときに、req.session.login == undefined になって、ログインしてないことがわかる
router.post('/logout', async (req, res, next) => { if (req.session != undefined && req.session.login != undefined) req.session.login = undefined; res.end(); });
なんか特別なログイン・ログアウトの仕組みがあるんかと思ってたけど、普通に自分でやればいいだけだったみたい^^