Unity移动端调用Apple撤销授权Token REST API无效问题咨询
Unity移动端Sign In With Apple Token撤销实现方案
亲测可稳定实现,绝大多数开发者遇到「接口返回200但Token未撤销」的问题,都是踩了苹果文档没明确标注的隐式校验坑,不是接口本身能力缺失。
先讲导致200假成功的3个核心坑
- 传错了待撤销的Token类型:直接拿登录回调里的短期
identityToken(JWT格式的用户标识令牌)或者一次性authorizationCode调用撤销接口,苹果不会返回参数错误,会直接回200但不执行任何操作。撤销接口只接受登录流程中签发的refresh_token作为入参。 - client_secret生成不符合隐式规则:苹果对JWT格式的客户端密钥校验极严,只要字段填错、有效期超长、签名算法不对,都会静默返回200不执行逻辑,没有任何错误提示。
- 本地登录态缓存未清理:Unity侧登录管理器如果缓存了之前的授权状态,撤销后没有主动清空,重启后读本地缓存自然会显示已授权,和接口是否生效无关。
具体落地实现步骤
1. 前置依赖准备
直接用苹果官方维护的Unity Sign In With Apple插件接入基础登录能力,不要用第三方未经验证的野插件,避免回调参数取值错误。
注意:涉及密钥签名、Token请求、撤销调用的逻辑必须放在自有业务服务端实现,绝对不要把苹果私钥打包进Unity客户端,否则会有私钥泄露、被苹果封禁Sign In With Apple权限的风险。
2. 登录阶段提前存好撤销所需的refresh_token
用户首次苹果登录成功后,按下面的流程拿refresh_token:
- 从Unity端登录回调中取出一次性的
authorizationCode,这个码有效期只有5分钟,拿到立刻传给服务端,不要本地存储。 - 服务端生成符合要求的
client_secret,这是ES256签名的JWT,必填字段如下,错一个就会假成功:iss:苹果开发者账号对应的Team IDiat:当前时间的UNIX时间戳(单位秒)exp:iat+ 1800以内,也就是这个密钥最长有效期30分钟,写超过直接无效aud:固定值https://appleid.apple.comsub:你在开发者后台配置Sign In With Apple时创建的Services ID(注意不是App的Bundle ID)
- 服务端调用苹果
/auth/token接口换refresh_token,参数如下:client_id: 你的iOS App的Bundle ID(注意这里和生成client_secret时的sub值不一样,填错也会假成功) client_secret: 上一步生成的JWT密钥 code: Unity端传上来的authorizationCode grant_type: 固定值authorization_code - 接口返回的
refresh_token是长期有效凭证,存在服务端和用户账号做绑定,不要下发到客户端存储。
3. 账号删除时执行Token撤销
用户触发账号删除流程时,服务端按下面的逻辑调用撤销接口:
- 重新生成新的有效期内的
client_secret,不要用之前缓存的旧密钥。 - 调用苹果
/auth/revoke接口,参数必须填全:client_id: 你的iOS App的Bundle ID client_secret: 新生成的JWT密钥 token: 该用户绑定存储的refresh_token token_type_hint: 固定值refresh_token(这个参数必须加,不加苹果会默认按access_token解析,解析失败就静默返回200不操作) - 接口返回200时即为撤销成功。
4. Unity客户端侧收尾
服务端返回撤销成功的响应后,Unity侧要立刻做两个操作:
- 调用登录插件的退出登录方法,主动向iOS系统请求更新当前App的苹果授权状态
- 清空本地所有和苹果登录相关的缓存,包括存在PlayerPrefs里的userID、identityToken、本地登录状态标记等,不要依赖重启自动清理。
有效性验证方法
不要靠本地缓存的登录状态判断是否撤销成功,撤销完成后调用插件提供的GetCredentialState方法查询授权状态,如果返回Revoked就代表Token已经真正失效,此时再重启App就不会出现已授权的提示。
内容的提问来源于stack exchange,提问作者oscar goldman
相关产品推荐
相关产品推荐

