面试题答案
一键面试令牌管理方面
- 令牌存储与标记
- 在数据库或其他存储介质中,为每个令牌添加一个额外的字段,例如“is_revoked”布尔字段。当授权撤销时,将对应令牌的“is_revoked”字段设置为
true
。每次使用令牌进行验证时,首先检查该字段,若为true
则拒绝该令牌的使用。 - 可以使用类似Redis这样的缓存存储令牌信息,在撤销授权时,直接从缓存中删除对应的令牌记录,或者设置一个特殊的标志(如过期时间为0等方式)来标记该令牌已撤销。这样在后续验证时,缓存中不存在该令牌或者有特殊标志就表明已撤销。
- 在数据库或其他存储介质中,为每个令牌添加一个额外的字段,例如“is_revoked”布尔字段。当授权撤销时,将对应令牌的“is_revoked”字段设置为
- 令牌有效期管理
- 尽量设置较短的令牌有效期。较短的有效期意味着即使令牌被非法获取,在撤销授权后,其可复用的时间也非常有限。例如,访问令牌的有效期设置为1小时甚至更短,刷新令牌的有效期可以相对长一些,但也不宜过长,如设置为7天。
- 在令牌过期后,即使没有进行撤销操作,该令牌也自然无法使用,从而减少了非法复用的可能性。
- 令牌加密与完整性校验
- 对存储的令牌进行加密处理,确保令牌数据的保密性。当授权撤销时,加密密钥可以进行更新,这样即使非法获取到之前的令牌数据,由于密钥改变,也无法正确解析和使用该令牌。
- 为令牌添加数字签名或消息认证码(MAC)等完整性校验机制。在验证令牌时,除了检查“is_revoked”字段和有效期外,还要验证令牌的完整性。如果令牌被篡改,完整性校验将失败,从而阻止非法复用。
系统交互方面
- 客户端交互
- 当授权撤销后,服务器端应及时通知客户端。可以通过推送通知(如Webhook等方式)告知客户端其授权已被撤销,客户端收到通知后应立即清除本地存储的相关令牌,避免再次使用。
- 在客户端进行每次请求时,除了携带令牌外,还可以发送一个额外的参数(如时间戳)。服务器端验证时,不仅验证令牌的有效性,还可以结合这个额外参数(如检查时间戳是否在合理范围内)来进一步防止令牌被非法复用。
- 资源服务器交互
- 资源服务器与授权服务器之间应保持紧密的通信。授权服务器在撤销授权后,应及时将撤销信息同步给资源服务器。可以采用定期同步机制,或者实时消息推送机制(如通过消息队列等方式)。
- 资源服务器在接收到请求时,除了本地验证令牌的基本信息(如有效期、签名等)外,还应向授权服务器进行二次确认(如通过远程调用授权服务器的验证接口),特别是对于重要的资源请求。这样即使本地令牌缓存出现异常,也能通过与授权服务器的交互确保已撤销的授权不会被非法复用。
- 多系统集成交互
- 如果涉及多个系统之间的OAuth 2.0集成,当一个系统撤销授权时,应通过统一的机制通知其他相关系统。例如,可以建立一个共享的授权状态管理中心,各个系统都从该中心获取最新的授权状态信息,确保所有系统对于已撤销授权的一致性处理,防止在不同系统间出现授权非法复用的情况。