如何确定OIDC场景下不透明访问令牌(opaque access token)的签发方?
可行方案梳理
- 预先配置可信任签发方列表是最优解(也是行业通用方案)
你最初的疑惑其实不是误区,作为资源服务器的REST API,本身就应该只信任预先对接的有限几个OIDC签发方,禁止动态信任未知签发方是基础的安全要求,不存在需要从不透明令牌中动态提取iss的必要性,这个方案最稳妥,性能也最高。 - 优化遍历签发方的体验
如果确实需要对接多个签发方,没必要每次都遍历所有iss调用userinfo接口验证,可以要求各签发方给不透明令牌添加统一前缀标识,比如签发方A的令牌前缀为issA_、签发方B的前缀为issB_,你拿到令牌后通过前缀即可直接匹配到对应iss,完全避免遍历开销,目前主流身份提供商都支持自定义令牌前缀的配置。 - 通过额外请求头携带iss标识
如果是你可控的客户端调用场景,可以要求客户端请求时除了Authorization头之外,额外携带X-Token-Issuer头传递签发方信息,只需在API网关层增加该头的防篡改校验即可,比如固定只允许几个合法的iss值传入,超出范围直接拒绝请求。 - 使用令牌内省协议替代UserInfo查询
如果对接的签发方支持标准的令牌内省接口,你可以预先配置好各iss对应的内省端点,拿到不透明令牌后直接调用内省接口,不仅可以拿到用户身份信息,还可以同时完成令牌有效性、过期时间、权限范围的校验,比调用UserInfo接口效率更高。
不建议的方案
WebFinger的设计场景是用户输入账号信息时匹配对应签发方,完全不适合API接收令牌后识别iss的场景;另外不要实现无限制的动态iss发现逻辑,会带来伪造签发方、恶意请求消耗服务资源等安全风险。
内容的提问来源于stack exchange,提问作者Hugh
相关产品推荐
相关产品推荐

