定义
OAuth2(Open Authorization 2.0)是行业标准的授权框架,允许第三方应用在用户授权后,以用户身份安全访问受保护资源,而无需暴露用户密码。在 ICMP 中,OAuth2 与 API Key 配合用于 RESTful API 鉴权,与 IAM 集成,保障 API 安全访问及 Partner Portal 单点登录。
核心概念
OAuth2 涉及角色:Resource Owner(用户)、Client(第三方应用)、Authorization Server(授权服务器)、Resource Server(资源服务器)。典型流程:Client 引导用户至 Authorization Server 登录授权;授权后获得 Access Token;Client 持 Token 访问 Resource Server 的 API。Token 有过期时间,可通过 Refresh Token 续期。
在 ICMP 中的应用
ICMP 使用 OAuth2 场景:API 鉴权——客户系统调用 RESTful API 时,可先通过 OAuth2 获取 Token,再持 Token 调用;Partner Portal——渠道通过 OAuth2 实现 SSO,无需单独维护密码;第三方集成——客户将 ICMP 能力集成至自有系统时,OAuth2 提供标准、安全的授权方式。平台 API Gateway 校验 Token 有效性、权限范围。
与 API Key 的配合
OAuth2 适合交互式、需用户授权的场景;API Key 适合服务端对服务端、长期有效的场景。ICMP 可同时支持:简单集成用 API Key;需细粒度权限、审计的场景用 OAuth2。两者均通过 IAM 管理,Audit Trail 记录访问日志。
令牌交出的是授权不是密码
OAuth2 在连接管理平台上的含义,是让一个调用方在不接触用户密码的前提下,短期代表用户或租户访问指定资源。授权服务器核验身份并颁发访问令牌,资源服务器只认令牌上的范围、受众和到期时间。令牌被接受,说明“这次调用被允许做范围内的事”,不是说明调用方变成了账户主人。刷新令牌用来换新的访问令牌,它本身也不应被拿去直接查卡或改账单。
适合用这种授权的场景,是有人在场确认,或一个已登记的应用需要受限制地访问接口。无人值守、长期固定的系统集成,更应使用单独颁发、可单独吊销的服务凭证,而不是让员工在浏览器里授权一次后把刷新令牌写进脚本。范围要按动作拆开,例如只读用量、可以暂停卡、可以导出账单,不要用一个“全部权限”范围。令牌传输应走传输加密,涉及付款或批量停机时再叠加双因素认证,避免一份令牌同时具备登录和资金操作的能力。
范围过大或有效期过长
常见错误是把访问令牌存进前端脚本或共享文档,并把它设成几个月不过期。令牌一旦泄露,获得者在到期前拥有与授权范围相同的能力,而且不一定触发密码修改后的失效。另一个错误是忽略受众:发给报表系统的令牌被拿到卡管理接口上使用,如果资源服务器不检查受众,越权调用会成功。
重定向地址若允许任意域名,授权码可能被发到攻击者控制的站点。服务端还应拒绝已经吊销的令牌,而不是只看签名是否正确。接入 OAuth2 时,要列出每个调用方的范围、有效期、允许的回调地址和吊销方法,并定期清理不再使用的授权。令牌是一次授权的凭证,不是可以转交的账号。
授权同意页应列出实际会访问的资源,例如读取用量、暂停卡或导出账单,而不是只写“代表你访问平台”。用户撤销后,已发出的访问令牌和刷新令牌都要失效,不能只停用刷新。服务端保存令牌时只保留无法反推出原值的校验信息。应用下线时同时删除它的客户端标识和回调地址,避免旧集成继续用历史授权换取新令牌。
公开的客户端拿不到只有服务器才能保管的密钥,授权码的交换要能防止截获后被别人换走令牌。回调地址必须事先登记为完整地址,不能只登记一个域名后允许任意路径。同意页展示的范围要和令牌里的范围一致,不能在用户同意“只读用量”之后另发一个可以停机的令牌。资源服务器同时检查签名、到期、受众和范围,缺一项就拒绝。
刷新令牌的保存和访问令牌不同。访问令牌时间短,可以放在当前会话里;刷新令牌时间长,只能放在调用方的服务器侧,不能放进浏览器脚本或移动应用的明文存储。刷新时旧的刷新令牌可以按策略作废,避免一份泄露的刷新令牌被反复使用。用户修改密码或管理员撤销授权后,两类令牌都失效,不能只让下一次刷新失败、当前访问令牌继续可用。
服务之间的长期调用不要伪装成某个员工的授权。员工离职后,挂在他名下的刷新令牌会一起失效,集成突然中断;若离职时忘了撤销,集成又会继续以他的身份操作。机器调用使用单独的客户端和最小范围,并在记录里显示客户端名称。这样审计能分清是人在门户里点击,还是某个系统在定时同步。
令牌里的范围用调用方能理解的动作名称展示,不要只显示一串内部编号。用户撤销某一项范围后,下一次调用就应失去该项能力,而不是要等到令牌自然过期才生效。