Sign in with Apple账号删除:是否需执行完整AccessToken吊销流程?
Sign in with Apple (SIWA) 账号删除与Token吊销实战指南
你忽略的核心问题
- Client Secret生成不规范
你之前生成的client secret不符合Apple的强制要求,必须包含固定的JWT Claim,且签名算法必须是ES256,否则直接返回invalid_client。 - 缺少关键凭证存储
你的流程只用到了ID Token,没有获取并存储Authorization Code、Access Token或Refresh Token,而这些是调用Apple吊销接口的必备凭证。 - Token请求参数不全/错误
调用Apple的token接口时,除了authorization_code和client_secret,还必须带上grant_type、client_id等必填参数,且redirect_uri必须与开发者后台配置一致。
解决invalid_client错误的实操步骤
1. 生成合规的Client Secret
Client Secret是Apple要求的JWT格式,必须包含以下Claim,且用ES256算法签名:
iss: 你的Apple开发者Team ID(开发者后台右上角可查)iat: 当前时间戳(秒级)exp: 过期时间,最长不能超过180天(6个月)aud: 固定为https://appleid.apple.comsub: iOS原生App填Bundle ID,跨平台/服务端场景填Service ID- 头部必须包含
kid: 生成PEM文件时对应的Key ID(开发者后台「Certificates, Identifiers & Profiles」→「Keys」里可查)
用Python生成的示例代码:
import jwt from datetime import datetime, timedelta # 替换成你的实际信息 TEAM_ID = "你的Team ID" BUNDLE_ID = "你的App Bundle ID" KEY_ID = "PEM文件对应的Key ID" PRIVATE_KEY_PATH = "Apple下载的PEM私钥文件路径" with open(PRIVATE_KEY_PATH, "r") as f: private_key = f.read() payload = { "iss": TEAM_ID, "iat": int(datetime.now().timestamp()), "exp": int((datetime.now() + timedelta(days=180)).timestamp()), "aud": "https://appleid.apple.com", "sub": BUNDLE_ID } client_secret = jwt.encode( payload, private_key, algorithm="ES256", headers={"kid": KEY_ID} )
2. 正确获取Access Token
向https://appleid.apple.com/auth/token发送POST请求,使用application/x-www-form-urlencoded格式,参数如下:
grant_type=authorization_code code=客户端获取的authorization_code(注意:此code只能使用一次) client_id=你的Bundle ID/Service ID client_secret=刚生成的合规Client Secret redirect_uri=com.apple.appid.authorize(iOS原生App固定值,需与后台配置一致)
请求成功后会返回access_token、refresh_token和id_token,你需要把这些(至少refresh_token)存储在服务器端,用于后续的吊销操作。
3. 执行Token吊销操作
当用户删除账号时,向https://appleid.apple.com/auth/revoke发送POST请求,参数如下:
client_id=你的Bundle ID/Service ID client_secret=合规的Client Secret token=要吊销的access_token或refresh_token(推荐用refresh_token,因为access_token可能已过期) token_type_hint=refresh_token(可选,帮助Apple快速识别token类型)
请求返回200即表示吊销成功,满足苹果的审核要求。
关于是否能绕过Token吊销流程
没有合法的绕过依据。苹果的审核规则明确要求:当用户请求删除账号时,必须撤销Apple颁发的所有相关tokens。此前你的流程是在规则生效前搭建的,但当前规则已更新,必须执行此步骤才能通过审核。
补充优化建议
- 调整你的原有流程:在客户端完成SIWA后,将
authorization_code而非ID Token发送到服务器,由服务器去Apple换取Access Token、Refresh Token和ID Token,再生成自研JWT返回给客户端。这样既保留了你简化客户端认证的需求,又能存储必要的凭证用于吊销。 - 定期刷新Refresh Token:如果用户长期登录,可使用Refresh Token换取新的Access Token,避免用户频繁重新登录。
内容的提问来源于stack exchange,提问作者Nirav Bhatt
相关产品推荐
相关产品推荐

