【node.js】expressでログイン処理を実装する方法

はじめに

また基本的な機能だけど、node.jsで初めてだったのでよくわからなかった

やりたかったことは以下
・ログイン情報はセッションにいれる
・特定のurl以下はログインしていないと見れなくしたい

ちょっと調べてみるとPassportというミドルウェアを使うのが定番ぽい。
が、今回は使わなかった。

実装

構成は以下とする

├── app.js # アプリ本体
├── login.js # ログイン
├── logout.js # ログアウト
├── member.js # member以下の共通処理
├── member # member以下はログインしてないと見れなくする
│   └── index.js

app.js

// express-sessionモジュール読み込み
var session = require('express-session');

// セッション管理                                                                                                                                                                                                  
app.use(session({
    secret: "secret key",
    resave: false,
    saveUninitialized: true
}));

// URL振り分け                                                                                                                                                                                                     
app.use("/", require("./index.js")());
app.use("/login", require("./login.js")());
app.use("/logout", require("./logout.js")());
app.use("/member/*", require("./member.js")());
app.use("/member/index", require("./member/index.js")());

login.js

var express = require("express");

module.exports = function() {
    var router = express.Router();

    router.get("/", function(req, res, next) {
        // 今回はハードコードでセッションにユーザー情報保持
        req.session.user = {
            id: 1,
            name: "Yamada"
        };
        res.redirect("/member/index");
    });
    return router;
};

logout.js

var express = require("express");

module.exports = function() {
    var router = express.Router();

    router.get("/", function(req, res, next) {
        req.session.destroy();
        res.redirect("/lndex");
    });
    return router;
};

member.js
※member以下のurlはここで必ずセッションをチェック

var express = require("express");

module.exports = function() {
    var router = express.Router();

    router.all("/*", function(req, res, next) {
        if (req.session.user) {
            // ログイン済みの場合はスルー
            next();
        } else {
            // 未ログインの場合はトップへリダイレクト
            res.redirect("/");
        }
    });
    return router;
};

member/index.js

var express = require("express");

module.exports = function() {
    var router = express.Router();

    router.get("/", function(req, res, next) {
        res.send(req.session.user); // {"id":1,"name":"Yamada"}
    });
    return router;
};

さいごに

今回はmember以下のディレクトリ(パス)はログインしていないと見れないようにした。
これで良いのか不明だがとりあえずはやりたいことはできそう

node.jsに限った話じゃないけどどうも便利なライブラリを使いこなせない。。。まずいな

以上です