引言
Bearer Token 认证是保护 API 和 Web 应用程序的广泛采用机制。它提供了一种简单而强大的方法来控制对受保护资源的访问。本指南将深入探讨 Bearer Token 认证的原理、其安全影响以及实现最佳实践。
📋 目录
关键要点
- 什么是 Bearer Token?:Bearer Token 是一种安全令牌,授予持有者(或“承载者”)访问受保护资源的权限。它包含在 HTTP 请求的
Authorization标头中。 - 无状态且可扩展:Bearer Token 认证是无状态的,意味着服务器无需存储会话信息。这使其具有高度可扩展性,非常适合微服务架构。
- 常与 JWT 结合使用:虽然 Bearer Token 可以有多种格式,但最常见的实现方式是使用 JSON Web Token (JWT)。
- 安全性至关重要:由于任何持有令牌的人都可以使用它,因此保护令牌安全至关重要。这包括使用 HTTPS、在客户端安全存储(例如,存储在
HttpOnlyCookie 中)以及缩短令牌的生命周期。 - 刷新令牌提升安全性:为提高安全性,应使用短期访问令牌和长期刷新令牌。当访问令牌过期时,刷新令牌可用于获取新的访问令牌,而无需用户重新登录。
需要生成或调试通常用作 Bearer Token 的 JWT 吗?我们的 JWT 工具提供了一个简单的界面,用于编码、解码和验证 JSON Web Token。
什么是 Bearer Token 认证?
Bearer Token 认证是 RFC 6750 中定义的 HTTP 认证方案。它涉及称为 bearer tokens 的安全令牌,由认证服务器颁发。客户端应用程序在向受保护资源发出请求时,必须在 Authorization 标头中包含此令牌。
GET /api/resource HTTP/1.1
Host: example.com
Authorization: Bearer <token>
术语“bearer”表示令牌的持有者(bearer)有权访问资源。这意味着任何持有令牌的一方都可以使用它,因此令牌安全至关重要。
主要特点
- 无状态:服务器无需存储令牌信息,因为每个令牌都是自包含且可验证的。
- 可扩展:非常适合分布式系统和微服务架构。
- 广泛支持:与各种协议和框架兼容,包括 OAuth 2.0 和 OpenID Connect。
- 灵活性:可与不同的令牌格式一起使用,例如 JWT(JSON Web Tokens)和不透明令牌。
Bearer Token 的工作原理
Bearer Token 认证的工作流程通常涉及三方:
- 客户端:请求访问受保护资源的应用程序。
- 授权服务器:负责对用户进行身份验证并颁发 bearer token。
- 资源服务器:托管受保护资源的服务器,负责验证令牌。
认证流程
- 用户认证:用户向客户端提供凭据(例如,用户名/密码)。
- 令牌请求:客户端将凭据发送到授权服务器。
- 令牌颁发:授权服务器验证凭据并颁发 bearer token(以及可选的刷新令牌)。
- 资源访问:客户端在向资源服务器发出的请求的
Authorization标头中包含 bearer token。 - 令牌验证:资源服务器验证令牌的签名、到期时间和声明。
- 资源响应:如果令牌有效,资源服务器将授予访问权限并返回请求的资源。
代码示例
JavaScript (Node.js) 与 Passport.js
Passport.js 是 Node.js 流行的认证中间件。passport-jwt 策略简化了 bearer token 的验证。
// 配置 passport-jwt 策略
import { Strategy as JwtStrategy, ExtractJwt } from 'passport-jwt';
const options = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: 'your-super-secret-key',
issuer: 'https://yourapp.com',
audience: 'your-audience'
};
passport.use(new JwtStrategy(options, async (payload, done) => {
try {
const user = await User.findById(payload.sub);
if (user) {
return done(null, user);
} else {
return done(null, false);
}
} catch (error) {
return done(error, false);
}
}));
// 保护路由
app.get('/profile', passport.authenticate('jwt', { session: false }), (req, res) => {
res.json({ user: req.user });
});
Python 与 Flask-JWT-Extended
Flask-JWT-Extended 是一个功能强大的扩展,用于在 Flask 应用程序中管理 JWT。
# Flask-JWT-Extended 实现
from flask import Flask, jsonify, request
from flask_jwt_extended import create_access_token, jwt_required, JWTManager, get_jwt_identity
app = Flask(__name__)
app.config["JWT_SECRET_KEY"] = "super-secret" # 修改我!
jwt = JWTManager(app)
@app.route("/login", methods=["POST"])
def login():
username = request.json.get("username", None)
password = request.json.get("password", None)
# 验证用户
if username != "test" or password != "test":
return jsonify({"msg": "错误的用户名或密码"}), 401
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token)
@app.route("/profile")
@jwt_required()
def profile():
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
Java 与 Spring Security
Spring Security 为 Java 应用程序中的 bearer token 认证提供了全面的支持。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.antMatchers("/api/public").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
}
}
常见问题解答 (FAQ)
1. Bearer Token 和 JWT 有什么区别? Bearer Token 是一种访问令牌。JWT (JSON Web Token) 是创建 Bearer Token 的一种流行格式。虽然大多数 Bearer Token 都是 JWT,但您也可以使用其他格式(如不透明令牌)。
2. 如何在客户端安全地存储 Bearer Token?
对于 Web 应用程序,将令牌存储在 HttpOnly cookie 中以防止 XSS 攻击。对于移动应用程序,请使用操作系统提供的安全存储机制(例如,iOS 上的 Keychain,Android 上的 Keystore)。
3. 什么是刷新令牌?为什么它们很重要? 刷新令牌是用于获取新的、短期访问令牌的长期令牌。这种模式通过最大限度地减少访问令牌的暴露来增强安全性。如果访问令牌被盗,它的生命周期很短,从而限制了潜在的损害。
4. 如何撤销 Bearer Token? 由于 JWT 是无状态的,撤销它们需要一个额外的步骤。您可以维护一个已撤销令牌的拒绝列表或使用较短的到期时间。对于不透明令牌,撤销更简单,因为授权服务器可以直接使令牌无效。
5. 我应该使用 HS256 还是 RS256 签名 JWT? 通常建议使用 RS256(非对称)而不是 HS256(对称)。使用 RS256,授权服务器使用私钥对令牌进行签名,资源服务器使用公钥对其进行验证。这可以防止资源服务器能够签署令牌,这是一种更好的关注点分离。
结论
Bearer Token 认证是现代应用程序安全的基石。通过理解其原理,实施安全最佳实践(如短期令牌和刷新令牌轮换),并利用强大的库,您可以构建安全且可扩展的认证系统。
始终优先考虑令牌安全,使用 HTTPS,并随时了解最新的安全建议。通过正确的实现,bearer token 为保护您的资源提供了可靠而灵活的解决方案。