在 Web 開發領域,安全性至關重要。保護 Web 應用程式最受歡迎的方法之一是 JSON Web 令牌 (JWT) 身份驗證。在本綜合指南中,我們將透過實際範例探討 JWT 身份驗證是什麼、它的工作原理以及如何在 Web 應用程式中實現它。
JWT 身份驗證是一種以 JSON 物件的形式在各方之間安全地傳輸資訊的方法。它通常用於驗證用戶身份並在客戶端和伺服器之間安全地傳輸資料。
JWT 身份驗證的工作原理是建立一個包含有關使用者或會話的編碼資訊的令牌。然後,該令牌隨每個請求從客戶端發送到伺服器,從而允許伺服器驗證請求的真實性並相應地授予存取權限。
以下是 JWT 身份驗證過程的簡化概述:
使用者驗證:當使用者登入 Web 應用程式時,伺服器會驗證他們的憑證(例如使用者名稱和密碼)。
令牌產生:身份驗證成功後,伺服器產生包含相關資訊(例如使用者 ID、過期時間)的 JWT,並使用金鑰對其進行簽署。
令牌傳輸:JWT 被發送回客戶端並儲存(通常在本機儲存或 cookie 中)以供將來使用。
請求授權:對於每個後續請求,用戶端都會在請求標頭中包含 JWT。
令牌驗證:伺服器驗證 JWT 的簽名並解碼其內容以驗證使用者身份並確定他們的存取權限。
回應處理:根據 JWT 的有效性和使用者的權限,伺服器處理請求並發送適當的回應。
標頭:包含有關令牌的元資料,例如令牌的類型和使用的雜湊演算法。
Payload :包含正在傳輸的實際資料,例如使用者資訊或權限。
簽章:透過組合標頭、有效負載和金鑰來確保令牌的完整性。
無狀態:JWT 是獨立的,不需要伺服器端儲存會話資料,這使得它們非常適合無狀態架構。
可擴展性:由於 JWT 不依賴伺服器端存儲,因此它們可以輕鬆擴展以適應大量用戶。
安全性:JWT 經過數位簽名,提供了在各方之間傳輸資料的安全方式。
讓我們來看一個在 Node.js 和 Express 應用程式中實作 JWT 身份驗證的簡單範例。
// Required Libraries
const express = require('express');
const jwt = require('jsonwebtoken');
// Create Express App
const app = express();
// Secret Key for JWT Signing
const secretKey = 'your-secret-key';
// Mock User Database
const users = [
{ id: 1, username: 'user1', password: 'password1' },
{ id: 2, username: 'user2', password: 'password2' },
];
// Route to Authenticate User and Generate JWT
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
// Generate JWT with user ID
const token = jwt.sign({ userId: user.id }, secretKey);
res.json({ token });
} else {
res.status(401).json({ message: 'Invalid credentials' });
}
});
// Middleware to Authenticate Requests
const authenticateToken = (req, res, next) => {
const token = req.headers['authorization'];
if (!token) return res.status(401).json({ message: 'Unauthorized' });
jwt.verify(token, secretKey, (err, user) => {
if (err) return res.status(403).json({ message: 'Invalid token' });
req.user = user;
next();
});
};
// Protected Route
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'Protected route accessed successfully' });
});
// Start Server
app.listen(3000, () => {
console.log('Server running on port 3000');
});
JWT 身份驗證是一種強大且廣泛使用的保護 Web 應用程式的方法。透過了解 JWT 的工作原理並遵循最佳實施實踐,您可以增強 Web 應用程式的安全性和可靠性。無論您是建立簡單的部落格還是複雜的企業應用程式,JWT 身份驗證都可以提供靈活且可擴展的解決方案來保護用戶資料並確保無縫的用戶體驗。
原文出處:https://dev.to/vyan/understanding-jwt-authentication-a-comprehensive-guide-with-examples-1l3