摘要
- RFC 7662 让受保护资源向授权服务器查询令牌的当前状态,并取得与该资源有关的元数据。
active: true是有分量的令牌状态结论,但不是对具体操作的批准,也不是执行成功或业务提交的收据。- 内省缓存把性能与实时性放在天平两端;令牌状态、资源授权和应用结果必须分别留证。
两盏绿灯之间还有一道门
OAuth 令牌内省解决的是一个很实际的问题。资源服务器收到一枚令牌,却未必能独立判断它是否仍然有效。它可以把令牌交给授权服务器查询。RFC 7662 规定,响应中必须包含 active;如果为真,还可以带回作用域、客户端、用户名、令牌类型、到期时间、受众、签发者等信息。
这不是一场只看 HTTP 状态码的仪式。RFC 对“活跃”给出了实质含义:通常,这枚令牌由该授权服务器签发,尚未撤销,并且仍处在有效时间内。授权服务器还应执行适用的检查,包括到期时间、尚未生效时间、撤销状态、签名,以及令牌能否用于正在查询的资源服务器。因此,active: true 确实排除了不少风险。
可它排除的不是所有风险。授权服务器掌握的是令牌及其授权生命周期,资源服务器掌握的则是眼前这次操作:谁要修改哪个对象、当前状态如何、租户边界是什么、额度是否耗尽、是否需要再次认证。令牌活跃,最多说明它可以作为授权判断的有效输入;它不能替资源服务器完成整项判断。
想象一枚带有账户写入作用域的令牌。它可能完全有效,但目标账户属于另一租户;也可能对象正被法律保全,或者请求违反当天的交易上限。内省端点看不到这些应用条件。把它的绿灯直接接到执行器上,相当于把一条证据误当成最后裁决。
Richer 写下的是接口边界
Justin Richer 是 RFC 7662 列出的作者。准确的说法是:这份 IETF 标准轨道文档以他的名字署名,规范了 OAuth 2.0 令牌内省。它是标准共同体的协议成果,并不意味着 Richer 个人控制任何部署,也不意味着每个实现选择都出自一人。
这份文档最有价值的地方之一,是把权力分在接口两侧。授权服务器可以对令牌状态作出权威判断;受保护资源可以根据自身策略决定请求。OAuth 的基础角色模型本来就这样安排:客户端携带访问令牌访问资源服务器,资源服务器验证令牌,并在请求符合条件时提供资源。内省只是取得验证事实的一种标准方法,不是把本地政策外包出去。
因此,审计记录不能只写“已授权”。更准确的证据链至少应回答:哪一个授权服务器在何时认定哪类令牌活跃;哪一个资源服务器消费了结果;采用了哪一版策略;最后允许或拒绝了什么请求。只保留一个绿色图标,会让事故复盘时最关键的责任边界消失。
谁来问,答案可能不同
内省响应并非面向所有资源的一份统一档案。RFC 7662 允许授权服务器根据发起查询的受保护资源调整响应。不同资源服务器可能得到不同的信息,返回的作用域也可以只限于与查询方有关的部分。这样既能减少不必要的披露,也能把令牌的可用性放在具体调用方的语境中。
这意味着,从 A 服务复制来的一条内省日志,不能自动证明 B 服务当时能看到相同字段或享有相同权限。查询方身份、资源语境和返回字段必须一起保存。RFC 8707 从另一个角度强调了边界:资源指示符说明令牌准备在哪里使用,作用域描述请求什么访问。地点和权限互相约束,却仍然没有回答某一笔业务操作是否应该发生。
可选字段也不能越级承担职责。exp 和 nbf 描述时间边界,aud 与 iss 帮助识别受众和签发者,sub、username、client_id 指向不同语境下的主体。jti 是令牌标识符,不是订单号、转账流水或应用提交编号。同一枚令牌通常会承载许多请求,用它来做幂等键,反而会把本应不同的操作错误合并。
“当前”取决于缓存有多旧
分布式系统里的现在,总带着一个时间戳。RFC 7662 明确允许资源服务器缓存内省响应。缓存可以减轻授权服务器负载,也能避免每次请求都增加一次网络往返。与此同时,规范明确指出代价:缓存时间越长,响应的实时性越弱。
假设资源服务器在 10:00 得到活跃结果,并缓存五分钟。10:01,令牌持有人通过 RFC 7009 定义的机制撤销了令牌,或管理员使相关授权失效。在缓存到期之前,资源服务器仍可能依据旧答案放行。授权服务器没有撒谎,资源服务器也未必违反配置;二者只是站在不同的时间截面上。
所以,缓存时长不是纯性能参数。它应当和令牌寿命、撤销承诺、操作敏感度、授权服务器可用性,以及错误放行的代价一起决定。读取公开目录与修改恢复凭据,不该仅因共用一个内省客户端就接受相同的陈旧窗口。
撤销也只负责令牌生命周期。RFC 7009 可以使令牌以及实现所决定的相关授权失效,却不会自动撤回已经发出的消息、逆转已经结算的款项,或恢复已经删除的数据。阻止未来使用与修复既有影响,是两套工作。
验证通过不等于操作有收据
即使资源服务器最终允许请求,执行结果仍可能不确定。服务可能在提交前失败,也可能提交后丢失响应;队列可能接收任务,而消费者稍后拒绝;客户端超时重试,两次请求都携带同一枚仍然活跃的令牌。
内省响应没有一个字段能化解这类歧义。作用域只约束操作类别,jti 只标识令牌,内省调用日志只证明查询发生并返回了令牌信息。对后果重大的接口还需要应用层的持久操作标识,例如幂等键、命令编号或条件版本;超时后还要能按该标识查询结果。
可靠的记录应把五件事分开:令牌验证、资源授权、操作身份、提交结果和响应送达。它们可以在追踪系统中关联,却不能被一条“令牌活跃”记录吞并。尊重 RFC 7662 的最好方式,不是弱化它,而是让它只对自己真正观察到的事实作证。
来源
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
