You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sign in with Apple账号删除:是否需执行完整AccessToken吊销流程?

Sign in with Apple (SIWA) 账号删除与Token吊销实战指南

你忽略的核心问题

  1. Client Secret生成不规范
    你之前生成的client secret不符合Apple的强制要求,必须包含固定的JWT Claim,且签名算法必须是ES256,否则直接返回invalid_client。
  2. 缺少关键凭证存储
    你的流程只用到了ID Token,没有获取并存储Authorization Code、Access Token或Refresh Token,而这些是调用Apple吊销接口的必备凭证。
  3. 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.com
  • sub: 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:02:46