JSON Web 令牌 (JWT) 是一種緊湊且獨立的方式,可將資訊作為 JSON 物件在各方之間安全地傳輸。 JWT 廣泛用於對 Web 應用程式中的使用者進行身份驗證。在本教程中,我們將使用 JWT 身份驗證來建立 Node.js 和 Express 後端。
JWT(JSON Web Token)是一種開放式標準,用於以 JSON 物件的形式在各方之間安全地傳輸資訊。每個令牌由三個部分組成:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
建立一個新的專案目錄:
mkdir jwt-auth-app cd jwt-auth-app
初始化一個新的 Node.js 專案:
npm init -y
安裝必要的依賴項:
npm install express jsonwebtoken bcryptjs dotenv express-validator
在 server.js 中建立基本伺服器設定:
// server.js require('dotenv').config(); const express = require('express'); const app = express(); app.use(express.json()); // Import Routes const authRoutes = require('./routes/auth'); app.use('/api/auth', authRoutes); const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
建立.env檔案用於儲存環境變數:
PORT=5000 JWT_SECRET=your_jwt_secret_key
// routes/auth.js const express = require('express'); const { body, validationResult } = require('express-validator'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const router = express.Router(); const users = []; // In-memory user storage // Signup Route router.post( '/signup', [ body('username').isLength({ min: 3 }), body('password').isLength({ min: 5 }) ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() }); const { username, password } = req.body; const hashedPassword = await bcrypt.hash(password, 10); users.push({ username, password: hashedPassword }); res.status(201).json({ message: 'User registered successfully' }); } ); // Login Route router.post( '/login', [ body('username').notEmpty(), body('password').notEmpty() ], async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() }); const { username, password } = req.body; const user = users.find(u => u.username === username); if (!user) return res.status(400).json({ message: 'Invalid credentials' }); const isMatch = await bcrypt.compare(password, user.password); if (!isMatch) return res.status(400).json({ message: 'Invalid credentials' }); const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' }); res.json({ token }); } ); module.exports = router;
const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
為了保護路由,請建立一個中間件來驗證令牌。
// middleware/auth.js const jwt = require('jsonwebtoken'); module.exports = function (req, res, next) { const token = req.header('Authorization')?.split(' ')[1]; if (!token) return res.status(401).json({ message: 'Access denied' }); try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (ex) { res.status(400).json({ message: 'Invalid token' }); } };
建立需要有效令牌的受保護路由:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0IiwidXNlcm5hbWUiOiJqb2huZG9lIn0.H6BBiB1y5eXKXvW9bbjT2Rg8Jp4oE4Y5Kxf_sDF7Kzg
在本教學中,我們介紹了在 Node.js 和 Express 後端設定 JWT 驗證的基礎知識。本指南示範了:
JWT 是一種處理身份驗證的強大方法,可讓您的 Web 應用程式既安全又可擴展。
以上是在 Web 應用程式中建立和保護 JWT 身份驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!