面试题答案
一键面试JWT在事件驱动架构中的用户身份认证和授权
- 身份认证:
- 在事件驱动架构中,当用户首次登录时,服务器验证用户的凭据(如用户名和密码)。如果验证通过,服务器会生成一个JWT。这个JWT就像是一个“数字身份证”,包含了用户的相关信息。
- 客户端在后续与系统交互时,会在请求的头部(通常是
Authorization
头)带上这个JWT。例如:Authorization: Bearer <JWT>
。 - 当事件生产者(如某个微服务)接收到请求时,它可以通过验证JWT的签名来确认该JWT的合法性。如果签名验证成功,就意味着该请求确实来自经过身份认证的用户,从而完成身份认证过程。
- 授权:
- JWT的载荷部分可以包含用户的权限信息。例如,一个用户可能有“读取订单”“创建订单”等不同的权限。这些权限信息被编码在JWT的载荷中。
- 当事件消费者(另一个微服务)接收到事件并需要进行授权判断时,它会从JWT载荷中提取出权限信息。然后,根据这些权限信息判断当前用户是否有权限执行该操作。比如,如果一个事件是创建新订单,事件消费者会检查JWT载荷中是否有“创建订单”的权限,如果有则允许操作,否则拒绝。
JWT载荷通常包含的关键信息
- 用户标识:
- 一般会包含用户的唯一标识符,比如用户ID。例如,
{ "sub": "1234567890" }
,其中sub
(subject的缩写)声明代表主体,这里就是用户的ID,这有助于系统准确识别用户身份。
- 一般会包含用户的唯一标识符,比如用户ID。例如,
- 用户名:
- 可以包含用户的登录名,如
{ "username": "john_doe" }
,方便系统在日志记录或展示相关信息时使用。
- 可以包含用户的登录名,如
- 权限信息:
- 如前面提到的,会包含用户所拥有的权限列表,例如
{ "permissions": ["read_order", "create_order"] }
,用于授权判断。
- 如前面提到的,会包含用户所拥有的权限列表,例如
- 过期时间:
- 用
exp
(expiration的缩写)声明表示JWT的过期时间,例如{ "exp": 1693766400 }
,时间以Unix时间戳表示。过期后,JWT将不再被认为是有效的,有助于提高安全性,定期强制用户重新认证。
- 用
- 颁发者:
- 用
iss
(issuer的缩写)声明表示JWT的颁发者,例如{ "iss": "my_application_server" }
,有助于验证JWT的来源。
- 用