根据苹果的审核新规,要求在6.30之前,提供账户注册的App也要提供相应的账户注销功能,这个相信大家都已经知道了。
需要注意的是,账户删除过程,官方资料要求,通过 Apple ID 登录的账户,注销时需要调用revoke token接口来撤销用户令牌,本文将会详细介绍这一流程。
调用revoke token接口
URL:appleid.apple.com/auth/revoke
可以由App端去调用,也可以交由后端处理,建议后端处理,毕竟涉及到账号的一些认证安全
请求头参数: Content-Type: application/x-www-form-urlencoded
请求参数如下:
1. client_id
项目的Bundle Identifier,不需要带Team ID,例如com.tencent.qq
2. client_secret
一段JSON Web Token(JWT),需要以特定的方式生成
-
登录Apple开发者中心,生成一个
p8文件
-
1、进入
Certificates, Identifiers & Profiles > Keys
,点击Keys
旁边的+
号,新建一个key -
2、填写名称,勾选
Sign In with Apple
,然后点击Configure
,选择项目对应的App ID
,完成configure配置,save返回上级界面继续完成注册 -
3、注册完成后下载p8文件,注意只能下载一次,记得保存好,需要的话传给后端。
-
4、记录当前界面的
Key ID
和Team ID
(项目Bundle Identifier的前缀部分),接下来会用到
-
-
使用
Ruby
生成需要的client_secret
-
1、运行命令
sudo gem install jwt
来设置ruby-jwt
-
2、编辑生成
secret_gen.rb
文件require "jwt" key_file = "此处填写p8文件路径" team_id = "此处填写Team ID" client_id = "此处填写Bundle Identifier" key_id = "此处填写Key ID" validity_period = 180 # In days. Max 180 (6 months) according to Apple docs. (过期时间,最大时间180天) private_key = OpenSSL::PKey::EC.new IO.read key_file token = JWT.encode( { iss: team_id, iat: Time.now.to_i, exp: Time.now.to_i + 86400 * validity_period, aud: "https://appleid.apple.com", sub: client_id }, private_key, "ES256", header_fields= { kid: key_id } ) puts token
-
3、运行刚刚生成的rb文件:ruby secret_gen.rb,获取client_secret
- 注意,生成的获取client_secret有效期跟上面文件标注的有效期一致,会有过期风险,需要重新生成新的
-
3. token
通过Generate and Validate Tokens接口获取
URL:appleid.apple.com/auth/token
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数如下:
-
client_id:项目的Bundle Identifier
-
client_secret:上面已经获取到
-
code:调用Apple登录时获取的
authorizationCode
-
grant_type: 这里可以使用固定字符串
"authorization_code"
-
refresh_token和redirect_uri可以不传
返回结果中提取到access_token
即为需要的token
此处返回的refresh_token
可用于后续的access_token刷新
,有需要也可以保存下来
4. token_type_hint
传入指定字符串“access_token”
即可
access_token刷新机制
access_token的有效期为3600s,即一小时,如果过期可以通过刷新机制来获取新的有效的access_token
同样是通过通过Generate and Validate Tokens接口来进行刷新
URL:appleid.apple.com/auth/token
请求头参数: Content-Type: application/x-www-form-urlencoded
请求体参数如下:
-
client_id:项目的Bundle Identifier
-
client_secret:上面已经获取到
-
refresh_token: 上述第三步获取到的refresh_token
-
grant_type: 这里可以使用固定字符串
"refresh_token"
-
code和redirect_uri可以不传
返回结果中提取到access_token
即为已刷新完毕的新access_token,可用于注销令牌等操作
新access_token的有效期也是3600s
撤销用户令牌结果
调用接口返回200即为成功,
注意,当token有误或已过期也会返回200,所以如何知道是否撤销成功呢?
再次登录需要授权展示如下界面时即为撤销成功
否则会展示如下
也可以进入手机 设置-》Apple ID -》 密码与安全性 -》 使用Apple ID的App ,查看Apple ID绑定情况
其它问题
-
authorizationCode有效时间为5分钟,access_token有效期为1小时,如果用户超出时间再去注销,会导致失效,如何避免?
针对这种情形,目前想到有两种解决方案:
1) 获取到authorizationCode,立即获取access_token,使用刷新机制保证access_token有效(见上文)
2)在注销前调用Apple ID授权,再次获取authorizationCode,即可解决
参考: