React Native Apple认证登录仅首次生效 无法获取邮箱问题求助
问题产生原因
该现象是Apple官方隐私保护策略的正常设计,并非代码或依赖库的bug:用户首次为应用授权Apple登录时,苹果才会在授权响应中返回你请求的email、fullName字段;后续无论你多少次重新发起登录请求、哪怕卸载重装应用,只要用户没有在iCloud设置中删除该应用的Apple登录授权,苹果服务端都不会再返回这两个字段,自然就无法获取到必填的邮箱参数。
可行解决方案
- 方案1:服务端关联存储用户信息(最推荐)
Apple登录返回的user字段是苹果为当前应用下的用户分配的唯一不变标识,你可以在首次登录拿到邮箱、姓名信息时,将这部分信息和user、identityToken绑定存储到你的业务服务端。后续登录时你只需要从授权响应中拿到user和identityToken,直接去服务端查询对应用户的存储信息即可,不需要依赖苹果重复返回邮箱等字段。
优化后的核心代码示例:import { appleAuth } from '@invertase/react-native-apple-authentication'; // 用于解析identityToken,不想引入依赖也可自行解析JWT的payload部分 import jwtDecode from 'jwt-decode'; const appleAuthRequestResponse = await appleAuth.performRequest({ requestedOperation: appleAuth.Operation.LOGIN, requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME], }).catch((err) => { console.log('登录失败', err) return null }) if (!appleAuthRequestResponse) return // 解析identityToken拿稳定的邮箱信息,不受首次授权限制 const decodedToken = jwtDecode(appleAuthRequestResponse.identityToken) // 苹果分配的永远不变的用户唯一标识,作为关联主键使用 const userUniqueId = appleAuthRequestResponse.user let userInfo // 首次授权有返回用户信息就用返回的,同步存储到服务端 if (appleAuthRequestResponse.email) { userInfo = { email: appleAuthRequestResponse.email, provider_id: appleAuthRequestResponse.identityToken, provider: 'apple', name: `${appleAuthRequestResponse.fullName.givenName} ${appleAuthRequestResponse.fullName.familyName}`, apple_user_id: userUniqueId } // 调用你自己的服务端接口存储userInfo } else { // 非首次授权,调用服务端接口用唯一标识查询已存储的用户信息 userInfo = await requestAppleUserInfo({ apple_user_id: userUniqueId, email: decodedToken.email, identity_token: appleAuthRequestResponse.identityToken }) } - 方案2:直接解析identityToken获取邮箱
苹果返回的identityToken是标准JWT格式,内部固定包含用户的邮箱信息(即使用户选择了隐藏邮箱,也会返回可用的代理邮箱地址),你可以直接解析该字段获取邮箱,完全不受首次授权的限制,不需要依赖响应里的email参数。 - 方案3:引导用户重置授权(不推荐)
如果你有特殊场景必须每次从苹果侧获取最新的用户信息,可以在检测到email字段为空时,弹窗引导用户前往「iPhone设置 - Apple ID - 密码与安全性 - 使用Apple ID的App」中删除当前应用的授权,重新登录即可重新拿到邮箱和姓名信息,该方案对用户体验影响较大,仅作为备选方案。
内容的提问来源于stack exchange,提问作者Puneet Kansal
相关产品推荐
相关产品推荐

