面试题答案
一键面试访问令牌生成过程
- 用户授权:
- 用户向客户端应用发起请求访问受保护资源。
- 客户端应用将用户重定向到授权服务器,请求授权。
- 授权服务器向用户展示授权页面,询问用户是否允许客户端应用访问其资源。
- 用户同意授权后,授权服务器生成授权码,并将用户重定向回客户端应用,同时带上授权码。
- 令牌请求:
- 客户端应用收到授权码后,使用授权码、客户端标识(如客户端ID和客户端密钥)向授权服务器发起获取访问令牌的请求。
- 这个请求通常是通过HTTPS POST请求发送到授权服务器的令牌端点。
- 生成与颁发:
- 授权服务器验证客户端的身份和授权码的有效性。
- 验证通过后,授权服务器生成访问令牌。访问令牌通常是一个随机生成的字符串,具有一定的长度和复杂度,例如使用UUID、JWT(JSON Web Token)等方式生成。
- 同时,授权服务器可能还会生成刷新令牌(用于在访问令牌过期时获取新的访问令牌),并将访问令牌、刷新令牌(如果有)以及其他相关信息(如令牌过期时间等)返回给客户端应用。
服务器端对访问令牌的验证
- 验证来源:
- 确保访问令牌是从授权服务器合法颁发的。对于使用JWT令牌,服务器可以验证令牌的签名。如果是其他类型的令牌,服务器可以通过查询授权服务器的数据库或使用与授权服务器约定的验证机制,确认令牌是由授权服务器生成的。
- 验证有效性:
- 检查令牌格式:确保令牌格式正确。例如JWT令牌需要符合其特定的JSON结构和编码规则。
- 检查过期时间:验证访问令牌是否过期。令牌通常会包含一个过期时间字段,服务器需要检查当前时间是否在令牌的有效期内。如果过期,服务器应拒绝访问,并要求客户端重新获取令牌。
- 验证权限:
- 访问令牌可能包含关于用户权限或可访问资源范围的信息。服务器需要验证令牌中声明的权限是否允许客户端访问请求的资源。例如,令牌可能声明了客户端只能访问用户的基本资料,那么如果客户端请求访问用户的敏感财务信息,服务器应拒绝该请求。
- 防止重放攻击:
- 服务器可以维护一个已使用令牌的列表(对于非一次性使用令牌情况)或使用其他机制(如时间戳、随机数等)来防止重放攻击。例如,对于每个请求的令牌,服务器检查该令牌是否已经在近期被使用过,如果是,则拒绝该请求。