接下來要學習如何使用 JWT (JSON Web Token) 進行使用者身份驗證與授權,並且了解它的運作原理。
JWT (JSON Web Token) 是基於JSON object的編碼,並透過這個編碼進行傳遞資訊。用於在應用程式中傳遞使用者的驗證訊息。JWT 通常用來處理身份驗證和授權,通過加密簽名保護資料的完整性,並以輕量化的方式傳遞資訊。
JWT 由三部分構成,使用「.」分隔:
JWT 通常應用在 身份驗證 系統中,基本上的流程會像下面這樣:
首先需要安裝一些套件來生成和驗證 JWT:
bash
npm install jsonwebtoken bcryptjs
接著要使用 Express 來建立一個簡單的登入系統,並透過 JWT 進行身份驗證。
設定 Express 應用與使用者模型:
js
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const app = express();
app.use(express.json());
const users = []; // 模擬的使用者資料庫
// 假設密鑰 (注意:在實際應用中應該要儲存在環境變數中)
const jwtSecret = 'supersecretkey';
用戶註冊與加密密碼:
js
app.post('/register', async (req, res) => {
const { username, password } = req.body;
// 加密密碼
const hashedPassword = await bcrypt.hash(password, 10);
// 儲存使用者
users.push({ username, password: hashedPassword });
res.status(201).send('User registered');
});
登入與生成 JWT:
js
app.post('/login', async (req, res) => {
const { username, password } = req.body;
// 檢查使用者是否存在
const user = users.find(u => u.username === username);
if (!user) {
return res.status(400).send('User not found');
}
// 檢查密碼是否正確
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) {
return res.status(401).send('Invalid password');
}
// 生成 JWT
const token = jwt.sign({ username: user.username }, jwtSecret, { expiresIn: '1h' });
res.json({ token });
});
保護路由(授權):
js
function authenticateToken(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.status(401).send('Access denied');
}
// 驗證 JWT
jwt.verify(token, jwtSecret, (err, user) => {
if (err) {
return res.status(403).send('Invalid token');
}
req.user = user;
next();
});
}
app.get('/protected', authenticateToken, (req, res) => {
res.send(`Hello, ${req.user.username}, you are authorized!`);
});
在這裡定義了一個 authenticateToken 中介軟體,用來解析和驗證 JWT,只有攜帶合法令牌的請求才能進入 protected 路由。
今天學習了 JWT 的基本概念以及它在驗證和授權中的應用。實作了簡單的使用者登入系統,使用 JWT 生成、驗證令牌,並且保護了敏感的 API 路由。JWT 可以在無狀態的應用程式中實現有效的身份驗證,在後續的應用開發中,這是建立安全系統的關鍵技術。