JWT用户认证后微服务间如何认证?(双向TLS(mTLS)、API网关、Refresh Token刷新Token)微服务间不传递用户认证Token
文章目录
- **1. 用户认证与 JWT 的作用**
- - **用户登录流程**:
- 1. 用户输入账号密码,向 **认证服务**(Auth Service)发送请求。
- 2. 认证服务验证用户身份,生成 **JWT**(含用户身份信息和权限)。
- 3. JWT 返回给客户端(浏览器或 App),客户端后续请求携带此 JWT。
- - **JWT 的特点**:
- - **无状态**:JWT 包含所有必要信息(如用户 ID、角色、过期时间等),无需服务器存储会话状态。
- - **可验证性**:每个微服务可通过验证 JWT 的签名和有效期来确认其合法性。
- **2. 微服务调用的认证方式**
- **场景一:客户端 → 微服务(用户请求)**
- - **认证流程**:
- - **优点**:
- **场景二:微服务 → 微服务(服务间调用)**
- - **认证需求**:
- - **认证方案**:
- 1. **服务间使用 API 网关**:
- 2. **服务间使用 OAuth2.0 客户端凭证模式**:
- 3. **共享密钥或签名验证**:
- - **优点**:
- **3. 是否需要重新认证?**
- - **不需要重新认证用户身份**:
- - **需要重新认证服务身份**:
- **4. 安全最佳实践**
- 1. **JWT 安全**:
- - 使用 **强签名算法**(如 HMAC-SHA256 或 RSA)。
- - 设置 **短有效期**(Access Token)和 **刷新令牌机制**。
- - 在 JWT 中添加 `iss`(签发者)、`aud`(受众)字段,防止 Token 被跨服务滥用。
- 2. **服务间通信**:
- - 使用 **双向 TLS**(mTLS)验证服务身份。
- - 避免直接传递用户 JWT,改用服务专属的 Token 或签名。
- 3. **API 网关**:
- - 集中处理认证、限流、日志记录等通用逻辑。
- - 对 JWT 进行统一验证,并注入服务间调用所需的上下文信息。
- 4. **刷新 Token 机制**:
- - 用户 JWT 过期后,客户端使用 **Refresh Token** 向认证服务申请新 Token。
- - Refresh Token 需存储在安全的地方(如 HttpOnly Cookie)。
- **5. 示例流程**
- **用户请求 → 微服务 A**
- 1. 客户端发送请求,Header 中携带 JWT。
- 2. 微服务 A 验证 JWT 签名和有效期。
- 3. 验证通过后,微服务 A 提取用户信息并处理请求。
- **微服务 A → 微服务 B**
- 1. 微服务 A 通过 API 网关调用微服务 B。
- 2. API 网关验证服务 A 的身份(如服务 ID + 签名)。
- 3. 网关附加服务间通信的 Token 或签名,转发请求给微服务 B。
- 4. 微服务 B 验证网关传递的 Token,处理请求。
- **6. 总结**
在微服务架构中,用户通过账号密码获取 JWT 后,微服务之间的调用方式和认证机制需要根据业务场景和安全需求进行设计。以下是详细的解决方案和最佳实践:
1. 用户认证与 JWT 的作用
- 用户登录流程:
1. 用户输入账号密码,向 认证服务(Auth Service)发送请求。
2. 认证服务验证用户身份,生成 JWT(含用户身份信息和权限)。
3. JWT 返回给客户端(浏览器或 App),客户端后续请求携带此 JWT。
- JWT 的特点:
- 无状态:JWT 包含所有必要信息(如用户 ID、角色、过期时间等),无需服务器存储会话状态。
- 可验证性:每个微服务可通过验证 JWT 的签名和有效期来确认其合法性。
2. 微服务调用的认证方式
场景一:客户端 → 微服务(用户请求)
- 认证流程:
- 客户端在请求头中携带 JWT(如
Authorization: Bearer <token>
)。 - 微服务收到请求后,验证 JWT 的签名(使用公钥或共享密钥)和有效期。
- 如果 JWT 有效,微服务提取其中的用户信息(如
userId
、roles
)进行授权(如检查权限)。 - 无需重新认证,因为 JWT 已包含用户身份信息。
- 优点:
-
无状态,适合分布式系统。
-
微服务无需依赖认证服务,减少耦合。
-
安全注意事项:
- 使用 HTTPS 传输 JWT,防止窃听。
- 设置合理的 JWT 过期时间(如 1 小时),配合 刷新令牌(Refresh Token)机制。
- 避免在 JWT 中存储敏感信息(如密码)。
场景二:微服务 → 微服务(服务间调用)
- 认证需求:
服务间通信需要确保调用方的身份合法性,但 不涉及用户身份,而是服务本身的身份验证。
- 认证方案:
1. 服务间使用 API 网关:
- 所有服务间调用必须通过 API 网关。
- 网关验证 JWT 的合法性,并附加服务间通信的专用令牌(如服务 ID 和签名)。
- 微服务只需信任网关的认证结果。
2. 服务间使用 OAuth2.0 客户端凭证模式:
- 每个微服务注册为 OAuth2.0 客户端,获取
client_id
和client_secret
。 - 服务调用时,使用
client_credentials
流程获取 服务专属的 Access Token。 - 调用方在请求头中携带此 Token,被调用方验证 Token 的合法性。
3. 共享密钥或签名验证:
- 服务间通信使用共享密钥对请求进行签名,被调用方验证签名的有效性。
- 适用于内部服务通信,但需确保密钥的安全存储。
- 优点:
- 解耦服务间认证逻辑,避免直接暴露用户 JWT。
- 提高安全性,防止 JWT 被滥用。
3. 是否需要重新认证?
- 不需要重新认证用户身份:
- 用户 JWT 在有效期内可被所有微服务信任,只要签名验证通过。
- 例如:用户访问
订单服务
和支付服务
时,无需重复登录。
- 需要重新认证服务身份:
- 服务间调用必须验证调用方的身份(如服务 ID 或 API Key),防止恶意服务伪装。
4. 安全最佳实践
1. JWT 安全:
- 使用 强签名算法(如 HMAC-SHA256 或 RSA)。
- 设置 短有效期(Access Token)和 刷新令牌机制。
- 在 JWT 中添加 iss
(签发者)、aud
(受众)字段,防止 Token 被跨服务滥用。
2. 服务间通信:
- 使用 双向 TLS(mTLS)验证服务身份。
- 避免直接传递用户 JWT,改用服务专属的 Token 或签名。
3. API 网关:
- 集中处理认证、限流、日志记录等通用逻辑。
- 对 JWT 进行统一验证,并注入服务间调用所需的上下文信息。
4. 刷新 Token 机制:
- 用户 JWT 过期后,客户端使用 Refresh Token 向认证服务申请新 Token。
- Refresh Token 需存储在安全的地方(如 HttpOnly Cookie)。
5. 示例流程
用户请求 → 微服务 A
1. 客户端发送请求,Header 中携带 JWT。
2. 微服务 A 验证 JWT 签名和有效期。
3. 验证通过后,微服务 A 提取用户信息并处理请求。
微服务 A → 微服务 B
1. 微服务 A 通过 API 网关调用微服务 B。
2. API 网关验证服务 A 的身份(如服务 ID + 签名)。
3. 网关附加服务间通信的 Token 或签名,转发请求给微服务 B。
4. 微服务 B 验证网关传递的 Token,处理请求。
6. 总结
场景 | 认证方式 | 是否需要重新认证 |
---|---|---|
用户请求 → 微服务 | JWT 验证 | 否 |
微服务 → 微服务 | API 网关验证 / 客户端凭证模式 | 是(服务身份) |
- 用户 JWT:无需重新认证,微服务直接验证其有效性。
- 服务间通信:需额外认证服务身份,避免直接使用用户 JWT。
通过合理设计认证流程,可以在保证安全性的同时,实现微服务架构的灵活性和可扩展性。