您是否正在努力為您的 Web 應用程式選擇正確的身份驗證方法?你不是一個人!在當今快速發展的數位環境中,了解各種身份驗證機制對於開發人員和企業都至關重要。本綜合指南將揭露五種關鍵身分驗證方法: session-based 、JWT、基於令牌、單一登入 (SSO) 和 OAuth 2.0。我們將探討每種方法如何滿足不同的安全需求,並協助您為下一個專案做出明智的決定。
session-based 的身份驗證就像在活動中獲得腕帶一樣。進入後,您可以存取所有內容,而無需再次出示您的 ID。
您使用您的使用者名稱和密碼登入。
伺服器會建立一個唯一的會話 ID 並將其儲存在 cookie 中。
您的瀏覽器會在每次要求時發送此 cookie,證明您仍然是您。
✅ 優點:
實施簡單
伺服器對會話具有完全控制權
❌ 缺點:
不適合行動應用程式
對於伺服器來說可能是資源密集型的
讓我們看看如何使用 Express.js 實作 session-based 的身份驗證:
const express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true,
cookie: { secure: true, maxAge: 24 * 60 * 60 * 1000 } // 24 hours
}));
app.post('/login', (req, res) => {
// Authenticate user
req.session.userId = user.id;
res.send('Welcome back!');
});
app.get('/dashboard', (req, res) => {
if (req.session.userId) {
res.send('Here's your personalized dashboard');
} else {
res.send('Please log in to view your dashboard');
}
});
app.listen(3000);
將JWT 視為數位護照。它包含您的所有重要訊息,您可以在不同的「國家」(服務)使用它,而無需每次都與您的祖國聯繫。
您登入後,伺服器會使用您的資訊建立 JWT。
您儲存此 JWT(通常在 localStorage 或 cookie 中)。
您隨每個請求發送 JWT,伺服器會驗證它。
標頭:令牌的類型和使用的雜湊演算法
有效負載:您的用戶資料(聲明)
簽名:確保令牌未被竄改
✅ 優點:
無狀態且可擴展
非常適合行動和單頁應用程式
可以包含使用者訊息,減少資料庫查詢
❌ 缺點:
下面是一個使用 Express.js 和jsonwebtoken
庫的簡單範例:
const jwt = require('jsonwebtoken');
app.post('/login', (req, res) => {
// Authenticate user
const token = jwt.sign(
{ userId: user.id, email: user.email },
'your-secret-key',
{ expiresIn: '1h' }
);
res.json({ token });
});
app.get('/dashboard', (req, res) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(401).send('Access denied');
try {
const verified = jwt.verify(token, 'your-secret-key');
res.send('Welcome to your dashboard, ' + verified.email);
} catch (err) {
res.status(400).send('Invalid token');
}
});
想像一下,擁有一把萬能鑰匙可以打開辦公大樓的所有門。這就是數位世界中的 SSO!
您登入中央 SSO 伺服器。
SSO 伺服器產生令牌。
透過此令牌,您可以造訪多個相關站點,而無需再次登入。
✅ 優點:
非常人性化
集中用戶管理
❌ 缺點:
設定複雜
如果 SSO 伺服器發生故障,則會影響所有連線的服務
1. You visit app1.com
2. App1.com redirects you to sso.company.com
3. You log in at sso.company.com
4. SSO server creates a token and sends you back to app1.com
5. App1.com checks your token with the SSO server
6. You're in! And now you can also access app2.com and app3.com without logging in again
OAuth 2.0 就像您汽車的代客鑰匙。它可以在不交出您的主密鑰的情況下對您的資源進行有限的存取。
OAuth 2.0 允許第三方服務在不暴露密碼的情況下存取使用者資料。它不僅用於身份驗證,還用於授權。
授權碼:最適合具有後端的網路應用程式
隱式:適用於行動和單頁應用程式(安全性較低,正在逐步淘汰)
客戶端憑證:用於機器對機器通信
密碼:當用戶真正信任該應用程式時(不建議用於公共應用程式)
刷新令牌:無需重新驗證即可取得新的存取令牌
✅ 優點:
高度靈活且安全
允許細粒度的權限
被各大科技公司廣泛採用
❌ 缺點:
正確實施可能很複雜
需要仔細的安全考慮
以下是使用 Express.js 的授權程式碼流程的簡化範例:
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/login', (req, res) => {
const authUrl = `https://oauth.example.com/authorize?client_id=your-client-id&redirect_uri=http://localhost:3000/callback&response_type=code&scope=read_user`;
res.redirect(authUrl);
});
app.get('/callback', async (req, res) => {
const { code } = req.query;
try {
const tokenResponse = await axios.post('https://oauth.example.com/token', {
code,
client_id: 'your-client-id',
client_secret: 'your-client-secret',
redirect_uri: 'http://localhost:3000/callback',
grant_type: 'authorization_code'
});
const { access_token } = tokenResponse.data;
// Use the access_token to make API requests
res.send('Authentication successful!');
} catch (error) {
res.status(500).send('Authentication failed');
}
});
app.listen(3000, () => console.log('Server running on port 3000'));
正如我們所看到的,每種身份驗證方法都有其優點和用例:
session-based:非常適合簡單的伺服器渲染應用程式
JWT :現代無狀態架構和行動應用程式的理想選擇
SSO :非常適合多種相關服務的企業環境
OAuth 2.0 :第三方整合和 API 存取的首選
選擇身份驗證方法時,請考慮應用程式的體系結構、使用者群、安全性要求和可擴展性需求。請記住,最佳選擇通常取決於您的特定用例,甚至可能涉及這些方法的組合。
確保安全,祝您編碼愉快!