我建立了一個 Node.js API 並想要保護它,所以我檢查了必須選擇的幾個選項。因此,我將引導您了解三種常見的驗證方法:基本驗證、JWT(JSON Web 令牌) 和 API 金鑰。
基本驗證非常簡單。客戶端在 Authorization 標頭中隨每個請求發送使用者名稱和密碼。雖然它很容易實現,但它並不是最安全的,除非您使用 HTTPS,因為憑證僅採用 Base64 編碼(未加密)。
要使用 Express 將基本驗證新增至您的 API,您需要:
npm install basic-auth
const express = require('express'); const basicAuth = require('basic-auth'); const app = express(); function auth(req, res, next) { const user = basicAuth(req); const validUser = user && user.name === 'your-username' && user.pass === 'your-password'; if (!validUser) { res.set('WWW-Authenticate', 'Basic realm="example"'); return res.status(401).send('Authentication required.'); } next(); } app.use(auth); app.get('/', (req, res) => { res.send('Hello, authenticated user!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
使用curl測試您的基本驗證:
curl -u your-username:your-password http://localhost:3000/
提示:始終使用 HTTPS 上的基本驗證以確保憑證受到保護。
JWT 是一種更安全且可擴展的使用者驗證方式。伺服器不會在每個請求中發送憑證,而是在登入時產生令牌。用戶端將此令牌包含在後續請求的 Authorization 標頭中。
首先,安裝所需的軟體包:
npm install jsonwebtoken express-jwt
以下是如何設定 JWT 驗證的範例:
const express = require('express'); const jwt = require('jsonwebtoken'); const expressJwt = require('express-jwt'); const app = express(); const secret = 'your-secret-key'; // Middleware to protect routes const jwtMiddleware = expressJwt({ secret, algorithms: ['HS256'] }); app.use(express.json()); // Parse JSON bodies // Login route to generate JWT token app.post('/login', (req, res) => { const { username, password } = req.body; if (username === 'user' && password === 'password') { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); return res.json({ token }); } return res.status(401).json({ message: 'Invalid credentials' }); }); // Protected route app.get('/protected', jwtMiddleware, (req, res) => { res.send('This is a protected route. You are authenticated!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
首先,登入取得令牌:
curl -X POST http://localhost:3000/login -d '{"username":"user","password":"password"}' -H "Content-Type: application/json"
然後,使用令牌存取受保護的路由:
curl -H "Authorization: Bearer <your-token>" http://localhost:3000/protected
JWT 很棒,因為令牌有過期時間,並且不必在每個請求中發送憑證。
API 金鑰驗證很簡單:您為每個用戶端提供一個唯一的金鑰,並將其包含在請求中。它很容易實現,但不如 JWT 安全或靈活,因為相同的金鑰會一遍又一遍地重複使用。最終是一個強大的解決方案,可以輕鬆地用於限制 api 調用的數量,並且許多網站都在使用它。作為額外的安全措施,可以將請求限製到特定的 IP。
您不需要任何特殊的軟體包,但使用 dotenv 來管理您的 API 金鑰是個好主意。首先,安裝dotenv:
npm install dotenv
然後,使用 API 金鑰驗證建立您的 API:
require('dotenv').config(); const express = require('express'); const app = express(); const API_KEY = process.env.API_KEY || 'your-api-key'; function checkApiKey(req, res, next) { const apiKey = req.query.api_key || req.headers['x-api-key']; if (apiKey === API_KEY) { next(); } else { res.status(403).send('Forbidden: Invalid API Key'); } } app.use(checkApiKey); app.get('/', (req, res) => { res.send('Hello, authenticated user with a valid API key!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
您可以使用以下方法測試您的 API 金鑰驗證:
curl http://localhost:3000/?api_key=your-api-key
或使用自訂標頭:
curl -H "x-api-key: your-api-key" http://localhost:3000/
基本驗證:
JWT 驗證:
API 金鑰驗證:
如果您正在尋找快速簡單的方法,基本驗證 可以使用,但請記住使用 HTTPS。如果您想要更強大、可擴充的安全性,請選擇 JWT。對於輕量級或內部 API,API 金鑰 驗證可能就足夠了。
您打算使用哪種身份驗證方法或您有其他解決方案嗎?請在評論中告訴我!
以上是保護 Node.js API:身份驗證簡單指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!