在SwiftUI iOS应用中实现SignInWithApple后的凭证存储疑问
Sign in with Apple 凭证处理方案(适配现有JWT架构)
核心结论
不需要在iOS客户端留存authorizationCode和identityToken,你的MySQL数据库只需要存储苹果提供的**唯一用户标识符(userIdentifier)**即可,但这两个凭证必须在首次认证时传给后端完成合法性验证。
各凭证的作用与处理方式
userIdentifier(必须存储)
这是苹果为用户分配的永久唯一标识,只要用户不删除你的应用或主动撤销授权,这个值不会变更。它是你在数据库中关联苹果登录用户的核心字段,建议在现有用户表新增apple_user_id字段来存储,实现与邮箱密码账号的关联。authorizationCode(一次性使用,无需存储)
这是苹果签发的一次性授权码,作用是让你的后端向苹果服务器验证本次登录请求的合法性。后端需要用这个码调用苹果的token接口换取验证信息,验证通过后该码立即失效,客户端不需要留存,直接传给后端即可。identityToken(仅用于首次信息同步,无需存储)
这是JWT格式的身份令牌,包含用户的基础信息(首次登录时会返回邮箱、姓名),后端可以解析它获取用户信息,同时验证签名确保令牌由苹果签发。这个令牌有过期时间,且后续登录可能不会返回完整信息,所以客户端不需要存储,直接传给后端处理。
结合现有邮箱密码/JWT架构的流程
首次登录(用户首次用苹果账号登录)
- 客户端获取
ASAuthorizationAppleIDCredential后,将userIdentifier、authorizationCode、identityToken(若有姓名/邮箱)一起发送到你的后端API。 - 后端调用苹果验证接口,用
authorizationCode验证登录合法性。 - 验证通过后,后端检查数据库是否存在
userIdentifier对应的用户:- 不存在:用
identityToken中的信息(或邮箱)创建新用户,将userIdentifier存入用户表。 - 已存在:直接关联到该用户记录。
- 不存在:用
- 后端生成你自己的JWT访问/刷新令牌返回给客户端,后续客户端用这个令牌与API交互。
后续登录(用户再次用苹果账号登录)
- 客户端获取
ASAuthorizationAppleIDCredential后,仅需将userIdentifier传给后端(也可附带identityToken让后端快速验证身份)。 - 后端根据
userIdentifier找到对应用户,直接返回你的JWT令牌即可。
关键注意事项
- 绝对不要在客户端存储
authorizationCode和identityToken,前者一次性失效,后者有过期风险且存储在本地存在安全隐患。 - 后端必须完成苹果凭证的验证流程,不能仅信任客户端传来的
userIdentifier,否则会存在伪造登录请求的风险。 - 监听苹果授权状态变化:通过
ASAuthorizationAppleIDProvider检查用户是否撤销了应用授权,若发生变更,需及时更新数据库中的用户状态或提示用户重新授权。
内容的提问来源于stack exchange,提问作者Samuel Davies
相关产品推荐
相关产品推荐

