认证 vs 授权
认证(Authentication):验证你是谁。授权(Authorization):确定你能做什么。OAuth 2.0 是授权框架,JWT 是令牌格式,两者常组合使用。
1. OAuth 2.0 四种模式
授权码模式(最安全)
1. GET /authorize?response_type=code&client_id=xxx&redirect_uri=xxx
→ 用户登录并授权
2. 回调 /callback?code=AUTH_CODE
3. POST /token { code, client_id, client_secret }
→ { access_token, refresh_token }
密码模式
POST /token
{
grant_type: "password",
username: "user@example.com",
password: "secure_password",
client_id: "app_client"
}
2. JWT 结构解析
// JWT = Header.Payload.Signature
Header: { "alg": "RS256", "typ": "JWT" }
Payload: { "sub": "123", "name": "John", "iat": 1516239022, "exp": 1516242622 }
Signature: HMACSHA256(base64(Header) + "." + base64(Payload), secret)
3. JWT 实战(Node.js)
const jwt = require('jsonwebtoken');
// 生成 Access Token(短时效)
const accessToken = jwt.sign(
{ userId: 123, role: 'admin' },
process.env.ACCESS_SECRET,
{ expiresIn: '15m' }
);
// 生成 Refresh Token(长时效)
const refreshToken = jwt.sign(
{ userId: 123, type: 'refresh' },
process.env.REFRESH_SECRET,
{ expiresIn: '7d' }
);
4. 双 Token 刷新机制
// 中间件:验证 Access Token
async function auth(req, res, next) {
try {
const payload = jwt.verify(req.headers.authorization, ACCESS_SECRET);
req.user = payload;
next();
} catch (err) {
if (err.name === 'TokenExpiredError') {
return res.status(401).json({ code: 'TOKEN_EXPIRED' });
}
return res.status(401).json({ code: 'INVALID_TOKEN' });
}
}
// 刷新接口
app.post('/api/refresh', async (req, res) => {
const { refreshToken } = req.body;
const payload = jwt.verify(refreshToken, REFRESH_SECRET);
const newAccess = jwt.sign({ userId: payload.userId }, ACCESS_SECRET, { expiresIn: '15m' });
const newRefresh = jwt.sign({ userId: payload.userId }, REFRESH_SECRET, { expiresIn: '7d' });
res.json({ accessToken: newAccess, refreshToken: newRefresh });
});
5. 安全最佳实践
| 实践 | 说明 |
|---|---|
| Token 短时效 | Access Token 15 分钟,降低泄露风险 |
| Refresh Token 轮换 | 每次刷新换新 Token,旧 Token 作废 |
| HTTPS Only | 绝不通过 HTTP 传输 Token |
| HttpOnly Cookie | Set-Cookie: HttpOnly; Secure; SameSite=Strict |
| Token 黑名单 | 登出时将 Token 加入 Redis 黑名单 |
总结
OAuth 2.0 + JWT 是现代 Web 应用认证授权的标准组合。理解授权码流程、双 Token 机制和安全最佳实践,是成为高级开发者的必经之路。