在当今 API 驱动的世界中,保护应用程序至关重要。在众多身份验证方法中,Bearer Token Authentication 以其简单性和有效性而脱颖而出。无论您是构建移动应用程序、微服务架构还是集成第三方 API,了解 Bearer Token 都至关重要。本指南通过实际示例和可作提示介绍了您需要了解的所有内容(从基础知识到最佳实践)。让我们开始吧!
什么是不记名令牌?(通往数字王国的钥匙)
想象一下,住在一家酒店,一张钥匙卡就可以进入您的房间、健身房和游泳池。您无需每次都出示 ID,只需刷卡即可。Bearer Token 的工作原理与数字系统类似。
Bearer Token 是服务器生成的一串字符 (如 ),用于验证请求。当客户端(例如,移动应用程序)在 HTTP Authorization 标头中发送此令牌时,服务器会对其进行验证,并在有效时授予对受保护资源的访问权限。eyJhbGci...
不记名令牌的主要特点
-
Stateless:
服务器不存储令牌。相反,令牌是自包含的(例如,带有嵌入数据的 JWT)或通过加密技术进行验证。 -
短期:
令牌会很快过期(几分钟到几小时),以降低泄露的风险。 -
简单集成:
只需将令牌附加到请求,无需复杂的会话管理。
不记名令牌身份验证的工作原理:3 步过程
步骤 1:获取 Token
客户端使用凭证(例如,用户名/密码、OAuth 2.0)向授权服务器进行身份验证。例如,使用 OAuth 2.0 客户端凭证流进行服务器到服务器通信:
curl -X POST https://auth.example.com/token \
-H "Content-Type: application/json" \
-d '{"client_id": "your_id", "client_secret": "your_secret"}'
服务器使用令牌进行响应:
{
"access_token": "xyz123",
"expires_in": 3600,
"token_type": "Bearer"
}
第 2 步:在 API 请求中使用令牌
客户端将令牌包含在后续请求的 Authorization 标头中:
curl -X GET https://api.example.com/user \
-H "Authorization: Bearer xyz123"
第 3 步:服务器端验证
服务器:
- 从标头中提取令牌。
- 验证它:
- 对于 JWT:验证签名、过期 ()、颁发者 () 和受众 ()。
exp
iss
aud
- 对于不透明令牌:根据数据库或内省终端节点进行检查。
- 对于 JWT:验证签名、过期 ()、颁发者 () 和受众 ()。
- 根据有效性授予或拒绝访问权限。
不记名令牌在哪里使用?
Bearer Token 为不同场景中的现代应用程序提供支持:
-
API 身份验证:
安全的 RESTful API(例如 Twitter、GitHub、Stripe)。
示例:从第三方 API 获取天气预报的天气应用。 -
单页应用程序 (SPA):
用户登录后,SPA(React、Vue)使用令牌对 API 调用进行身份验证,而无需重新加载页面。 -
微服务通信:
服务使用令牌而不是共享凭据来相互验证。 -
OAuth 2.0 和 OpenID Connect:
不记名令牌通过充当 OAuth 2.0 访问令牌来启用委托访问(例如,“使用 Google 登录”)。
不记名令牌与替代方案:您应该使用哪个?
方法 | 优点 | 缺点 |
---|---|---|
不记名令牌 | 短期、OAuth 就绪、无状态 | 需要 HTTPS;令牌盗窃 = 访问权限 |
API 密钥 | 易于实施 | 长寿;难以撤销 |
基本身份验证 | 内置于 HTTP 中 | 在每个请求中发送 base64 编码的凭据 |
何时选择 Bearer Tokens:
- 构建可扩展的无状态 API。
- 集成 OAuth 2.0 或 OpenID Connect。
- 需要短期的精细访问。
安全最佳实践:保护您的代币!
-
在所有地方
强制实施通过 HTTP 发送的令牌容易受到拦截。HTTPS 对传输中的数据进行加密。 -
安全地存储令牌
- 前端:避免使用 localStorage (XSS 风险)。使用 httpOnly cookie 或安全会话存储。
- 后端:加密存储的令牌并使用 Secrets Manager(例如 AWS Secrets Manager)。
-
Keep Tokens Short-Lived
将过期时间设置为 1-2 小时。使用刷新令牌续订访问权限,无需用户交互。 -
使用范围
限制令牌权限
定义范围(例如, , )以限制令牌可以执行的作。read:data
write:data
-
轮换和撤销代币
- 旋转:定期发行新令牌。
- 撤销:维护令牌阻止列表或使用有效期较短的 JWT。
-
彻底验证令牌
- 对于 JWT:验证加密签名并检查标准声明 (、、)。 使用 (Node.js) 或 (Python) 等库。
exp
iss
aud
jsonwebtoken
PyJWT
- 对于 JWT:验证加密签名并检查标准声明 (、、)。 使用 (Node.js) 或 (Python) 等库。
要避免的常见错误
错误 1:在 URL 中公开令牌
🚫 坏:
https://api.example.com/data?token=xyz123
✅ 修复:
始终使用 Authorization 标头。
错误 2:忽略令牌过期
🚫 错误:
使用永不过期的令牌。
✅ 修复:
设置合理的值并自动刷新逻辑。exp
错误 3:在代码中对令牌进行硬编码
🚫 坏:
const API_TOKEN = "xyz123"; // Exposed in source control!
✅ 修复:
使用环境变量或 Secret 管理器。
不记名令牌的实际应用:JWT 深入探讨
大多数不记名令牌是 JSON Web 令牌 (JWT),它由三个部分组成:
标头(算法和令牌类型):
{
"alg": "HS256",
"typ": "JWT"
}
有效负载(有关用户和令牌的声明):
{
"sub": "user_123",
"name": "Alice Smith",
"exp": 1716239022
}
签名:
计算如下:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key)
验证的工作原理:
服务器使用其密钥重新计算签名。如果它与 Token 的签名匹配,则 Token 有效。
简化 Bearer Token 管理的工具
- APY Hub 目录:使用预构建的 API 大规模生成、验证和管理令牌。
- JWT 签名:安全地对令牌进行签名和验证。
- OAuth 集成:简化 OAuth 2.0 流程。
- 令牌自省:以编程方式检查令牌有效性。
- 邮差:使用 Bearer Tokens 轻松测试 API。
- Auth0 中:用于基于令牌的身份验证的强大身份平台。
- JWT.io:免费调试和检查 JWT。
结论
Bearer Token Authentication 是现代安全性的基石,它在简单性与强大的保护之间取得了平衡。通过遵守最佳实践(例如强制执行 HTTPS、使用短期令牌和利用 ApyHub 等工具),您可以保护您的 API 并专注于构建出色的用户体验。
如果我的 Bearer Token 被盗怎么办?
- 短期到期:尽量减少曝光时间。
- HTTPS 的 URL:防止拦截。
- 撤销:通过阻止列表使被盗用的令牌失效。
不记名令牌和 JWT 是否相同?
不。Bearer Tokens 是指身份验证方法,而 JWT 是一种可用作 Bearer Tokens 的令牌。
如何刷新过期的令牌?
使用刷新令牌(有效期很长)获取新的访问令牌,而无需重新进行身份验证。
服务器可以使用 Bearer Token 相互通信吗?
是的,使用 OAuth 2.0 客户端凭证流进行安全的服务器到服务器通信。
为什么不直接使用 API 密钥呢?
API 密钥通常缺乏过期时间、范围和标准化,这使得它们对于现代应用程序来说风险更大。
发表评论 取消回复