Android端基于Firebase实现Apple账号授权撤销方案问询
Android端Firebase Apple账号权限撤销方案
方案一:自定义Apple OAuth2流程获取Authorization Code
Firebase默认的Apple登录流程不会返回Authorization Code,需要自行实现Apple的OAuth2授权流程,同时完成Firebase认证:
- 在Apple开发者后台配置Android应用:创建Service ID并启用「Sign In with Apple」,绑定应用包名和签名指纹,记录Service ID(即Client ID)和Team ID。
- 使用AppAuth库发起授权请求,指定scope为
openid email,引导用户完成Apple登录后即可获取Authorization Code。 - 拿到Authorization Code后,调用Firebase认证接口完成登录,同时将Code加密存储(如本地SharedPreferences或Firebase云端):
// 用Authorization Code生成Firebase凭证 val credential = OAuthProvider.newBuilder("apple.com") .setAuthorizationCode(authorizationCode) .build() FirebaseAuth.getInstance().signInWithCredential(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { // 保存Authorization Code到安全位置 } } - 撤销权限时,使用存储的Authorization Code,结合Apple开发者私钥生成JWT签名,向
https://appleid.apple.com/auth/revoke发送POST请求,参数包含:client_id:你的Service IDtoken:存储的Authorization Codetoken_type_hint:authorization_code
方案二:通过Firebase获取Apple Refresh Token实现撤销
如果不想自定义OAuth流程,可以通过请求offline_access scope让Firebase返回Apple的Refresh Token,再用该Token调用撤销API:
- 发起Firebase Apple登录时,添加
offline_accessscope:val provider = OAuthProvider.newBuilder("apple.com") // 添加所需scope provider.addCustomParameter("scope", "openid email offline_access") // 启动登录流程 FirebaseAuth.getInstance().startActivityForSignInWithAuth(activity, provider.build()) .addOnCompleteListener { task -> if (task.isSuccessful) { // 获取用户信息 val user = task.result?.user // 从Provider数据中提取Apple的Refresh Token val appleProvider = user?.providerData?.firstOrNull { it.providerId == "apple.com" } val refreshToken = appleProvider?.refreshToken // 加密存储Refresh Token } } - 撤销权限时,使用Refresh Token调用Apple的撤销API,请求参数调整为:
token:存储的Refresh Tokentoken_type_hint:refresh_token
其余参数(client_id、JWT签名)与方案一一致。
关键注意事项
- Apple的撤销API要求请求必须用JWT签名,签名需使用Apple开发者后台下载的私钥,JWT的Claim需包含:
iss(Team ID)、iat(当前时间戳)、exp(过期时间戳,最长1小时)、aud(固定为https://appleid.apple.com)、sub(Service ID)。 - 开发者私钥绝对不能暴露在客户端代码中,建议将JWT生成和撤销请求逻辑放在后端服务,客户端调用自有后端接口完成权限撤销。
- 存储Authorization Code或Refresh Token时必须加密,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者user3752302
相关产品推荐
相关产品推荐

