Skip to main content

plugin

在使用 Express 作為後端框架時,你可以使用一些現有的插件和工具來實現 IAM(Identity and Access Management)。這些工具會幫助你管理身份驗證、授權,以及用戶的訪問控制權限。以下是一些常用的插件和方法來實現 IAM:

1. 身份驗證(Authentication)插件

這部分專注於確認使用者身份的真實性。

  • Passport.js

    • 最常用的 Node.js 身份驗證中介軟件。
    • 支持多種身份驗證策略,包括本地策略(Local)、OAuth、JWT、Google、Facebook 等。
    • 可以使用多種策略來處理不同的登錄方式,並且易於集成到 Express 應用程序中。
    • 官方文檔

    安裝方式

    npm install passport passport-local

    範例代碼

    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;

    passport.use(new LocalStrategy((username, password, done) => {
    // 在此驗證用戶名與密碼
    User.findOne({ username: username }, (err, user) => {
    if (err) return done(err);
    if (!user) return done(null, false, { message: 'Incorrect username.' });
    if (!user.verifyPassword(password)) return done(null, false, { message: 'Incorrect password.' });
    return done(null, user);
    });
    }));
  • JSON Web Token (JWT)

    • 使用 JSON Web Tokens 來實現無狀態的身份驗證(Stateless Authentication)。
    • 可以在客戶端存儲 token,並在每次請求時通過 Authorization 標頭傳遞 token。
    • 常用的插件是 jsonwebtokenexpress-jwt

    安裝方式

    npm install jsonwebtoken express-jwt

    範例代碼

    const jwt = require('jsonwebtoken');
    const secretKey = 'your-secret-key';

    // 登錄後簽發 token
    app.post('/login', (req, res) => {
    const token = jwt.sign({ userId: req.user.id }, secretKey, { expiresIn: '1h' });
    res.json({ token });
    });

    // 驗證 token
    const { expressjwt: jwtMiddleware } = require('express-jwt');
    app.use(jwtMiddleware({ secret: secretKey, algorithms: ['HS256'] }));

2. 授權(Authorization)插件

授權涉及使用者訪問系統資源的權限控制。

  • RBAC (Role-Based Access Control)

    • express-rbac:一個簡單的基於角色的訪問控制中介軟件。
    • 你可以為使用者定義不同的角色(如 admin, user, guest),並基於這些角色分配不同的權限。

    安裝方式

    npm install express-rbac

    範例代碼

    const rbac = require('express-rbac');

    const rules = {
    admin: { can: ['create', 'update', 'delete', 'read'] },
    user: { can: ['read'] },
    };

    app.use(rbac.init(rules));

    // 使用角色來控制路由訪問
    app.post('/resource', rbac.can('create'), (req, res) => {
    res.send('Resource created');
    });
  • ACL (Access Control List)

    • acl:一個支持 ACL 的中介軟件,允許基於使用者、角色和資源的訪問權限控制。
    • 支持基於 MongoDB、Redis、Memory 來儲存 ACL 規則。

    安裝方式

    npm install acl

    範例代碼

    const Acl = require('acl');
    const acl = new Acl(new Acl.memoryBackend());

    // 定義角色與權限
    acl.allow([
    {
    roles: 'admin',
    allows: [{ resources: '/api/resource', permissions: '*' }],
    },
    {
    roles: 'user',
    allows: [{ resources: '/api/resource', permissions: 'get' }],
    },
    ]);

    // 檢查權限
    app.get('/api/resource', acl.middleware(), (req, res) => {
    res.send('Resource accessed');
    });

3. 自動化用戶管理(User Management)

  • Keycloak

    • 一個開源的 IAM 解決方案,可以用來集中管理身份驗證和授權。Keycloak 支持 SSO、LDAP、社交登入、OAuth2 和 OIDC。
    • 通過 Keycloak Node.js 連接器,你可以很容易將 Keycloak 與 Express 應用集成。

    Keycloak-Connect 安裝:

    npm install keycloak-connect

    範例代碼

    const session = require('express-session');
    const Keycloak = require('keycloak-connect');

    const memoryStore = new session.MemoryStore();
    const keycloak = new Keycloak({ store: memoryStore });

    app.use(session({ secret: 'secret', resave: false, saveUninitialized: true, store: memoryStore }));
    app.use(keycloak.middleware());

    app.get('/protected', keycloak.protect(), (req, res) => {
    res.send('This is a protected resource');
    });

4. 審計與日誌管理

  • Winston:用來記錄安全相關的事件,如登入失敗、權限拒絕等。
  • Morgan:用來記錄 HTTP 請求,方便審計使用者的操作。

安裝方式

npm install winston morgan

範例代碼

const winston = require('winston');
const morgan = require('morgan');

// 設置 winston 日誌
const logger = winston.createLogger({
transports: [new winston.transports.Console()],
});

// 使用 morgan 記錄 HTTP 請求
app.use(morgan('combined', { stream: logger.stream }));

小結

為了實現 IAM,你可以使用 Passport.jsJWT 來管理身份驗證,使用 express-rbacacl 來進行授權控制,並整合 Keycloak 來提供全面的身份管理解決方案。這些工具組合起來,能夠在 Express 應用中構建出一個完整的 IAM 系統,確保安全性和可擴展性。