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。
- 常用的插件是 jsonwebtoken 和 express-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.js 和 JWT 來管理身份驗證,使用 express-rbac 或 acl 來進行授權控制,並整合 Keycloak 來提供全面的身份管理解決方案。這些工具組合起來,能夠在 Express 應用中構建出一個完整的 IAM 系統,確保安全性和可擴展性。