だら$ちっぷす

仕事の覚書です

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();
});


なんか特別なログイン・ログアウトの仕組みがあるんかと思ってたけど、普通に自分でやればいいだけだったみたい^^