一、背景
由于OAuth隐式授权模式存在一定的安全风险,2023 年 9 月 30 日起小米账号将下线 “隐式授权模式”。
二、风险说明
OAuth隐式授权是基于授权码授权模式下,对于无服务端校验的接入方的降级方案,由于不存在对于client_secret的校验,所以存在一定的安全风险。
RFC风险说明
资源所有者可以通过授予访问令牌给攻击者的恶意客户端,有意地将访问资源的访问权限委托给对方。这可能是因为钓鱼或其他借口。攻击者也可以通过其他机制窃取令牌。然后攻击者可以提供访问令牌给合法的公共客户端,试图冒充资源所有者。
在隐式流程(response_type=token)中,攻击者可以轻易地通过替换授权服务器响应中的真实访问令牌来切换令牌,从而使是用以前颁发给攻击者的令牌。
与依赖于通过后通道传递访问令牌来识别客户端用户的本机应用程序通信的服务器也可能被攻击者创建的可以注入任意窃取访问令牌的恶意应用程序所妥协。
任何假设只有资源所有者可以为其提供资源的有效访问令牌的公共客户端均易受此类攻击的影响。
此类攻击可能会向恶意客户端暴露有关资源所有者的信息。这也将允许攻击者使用与最初授予访问令牌或授权码的资源所有者相同的权限在合法客户端执行操作。
此规范不包括将资源所有者身份验证到客户端的范围。任何将授权过程用作委派的最终用户身份验证的规范(例如第三方登录服务),如果没有额外的安全机制使客户端可以确定访问令牌是否颁发供其自己使用(例如限制访问令牌的受众)则不得使用隐式流程。
三、如何判断是否正在使用隐式授权模式
1、查看自己名下应用是否存在“隐式授权模式”调用
查看步骤:
步骤1: 使用开发者账号登录后访问 https://dev.mi.com/passport/oauth2/applist,展示名下应用列表
步骤2: 点击应用图标进入应用详情
步骤3: 如下图,“2023年3月份隐式授权总次数”中红色数字就是在各个端的“隐式授权模式”调用次数;如没有“2023年3月份隐式授权总次数”则说明该应用没有使用“隐式授权模式”

2、查看自己代码逻辑中是否包含“隐式授权”的代码
Web端
Web应用在请求https://account.xiaomi.com/oauth2/authorize中使用了responseType=token参数,则为使用了隐式授权模式
安卓
如果安卓应用通过小米账号Android SDK(https://github.com/xiaomi-passport/oauth-android-sdk)接入小米账号登录,如果使用了小米账号 安卓sdk中startGetOAuthToken则为使用了隐式授权模式
iOS
如果iOS应用通过小米账号iOS SDK(https://github.com/xiaomi-passport/oauth-ios-sdk)接入小米账号登录,使用了中以下方法则为使用了隐式授权模式
- (void)applyAccessTokenWithPermissions:(NSArray *)permissions
state:(NSString *)state
completeBlock:(MOCompleteBlock)block DEPRECATED_MSG_ATTRIBUTE("use applyAuthCodeWithPermissions:state:completeBlock:");
- (void)applyAccessTokenWithPermissions:(NSArray *)permissions
state:(NSString *)state
deviceId:(NSString *)deviceId
completeBlock:(MOCompleteBlock)block DEPRECATED_MSG_ATTRIBUTE("use applyAuthCodeWithPermissions:state:completeBlock:");四、如何修改
删除“隐式授权模式”调用代码,使用“授权码授权模式”,接入文档:
Web
https://dev.mi.com/xiaomihyperos/documentation/detail?pId=1513#_10
安卓SDK
https://mzd5tljlyv.feishu.cn/docs/doccnCKqdBhEUX5Lq5izm4Apswe#IQr3Hr
iOS SDK
使用applyAuthCodeWithPermissions,参考 https://github.com/xiaomi-passport/oauth-ios-sdk
五、更多帮助
1、小米账号OAuth2.0文档汇总:https://dev.mi.com/xiaomihyperos/documentation/detail?pId=1512#_6
2、如需要帮助请邮件联系xiaomi-account@xiaomi.com、security@xiaomi.com