架构 (IT)后端架构师

如何在分布式 IT 架构中实现授权和身份验证层?

用 Hintsage AI 助手通过面试

回答。

在分布式架构中实现授权和身份验证层,通常使用集中管理身份的系统,如 OAuth 2.0、OpenID Connect 或企业身份提供者 (IdP)。身份验证(确认身份)通过外部提供者进行,之后结果(通常是令牌)用于在所有服务中进行授权(授予权限)。

通常,流程如下:

  1. 用户通过 IdP 进行身份验证。
  2. 获取访问令牌(例如,JWT)。
  3. 在访问每个服务时,用户在请求头中提供令牌。
  4. 服务验证令牌并从声明中提取访问权限。

以下是 Python 通过 PyJWT 库验证 JWT 令牌的代码示例:

import jwt from jwt.exceptions import InvalidTokenError def verify_jwt(token, public_key): try: payload = jwt.decode(token, public_key, algorithms=["RS256"]) return payload except InvalidTokenError: return None # 使用示例 user_info = verify_jwt(received_token, public_key) if user_info: # 访问被允许 pass else: # 访问被拒绝 pass

关键特性:

  • 集中访问控制由单一真实来源编码(如 IdP,例如 Keycloak 或 Auth0)
  • 安全性通过令牌化和签名验证实现(例如,JWT)
  • 支持 SSO 和多因素身份验证

难题问题。

问题: 是否必须将用户权限的所有信息直接存储在 JWT 令牌中?

不必。为最小化令牌大小,通常只放用户 ID 和最小权限/角色集。详细权限可以通过额外请求或加载的配置声明按需从服务器获取。

问题: 刷新令牌是否是所有分布式架构的必备元素?

不,只有在需要长期会话而无需重新身份验证时才需要刷新令牌。在无状态 API 中,往往仅使用短期的访问令牌,而刷新逻辑则仅在 Web 或移动客户端中实现。

问题: JWT 中的有效负载部分可以加密吗?

根据 JWT 标准 (RFC 7519),有效负载仅被签名,而不被加密。加密使用另一种标准 — JWE(JSON Web Encryption)。否则,任何拥有令牌的人都可以读取有效负载(例如,通过 jwt.io):

import jwt jwt.decode(token, options={"verify_signature": False})