使用Apple JS登录无法获取用户姓名数据求助
问题:Sign in with Apple授权后无法获取用户全名
我按照Apple官方文档配置了Sign in with Apple JS,已经在scope中传入了name email,但授权成功后没有返回预期的name字段。
预期返回数据:
{ "authorization": { "code": "[CODE]", "id_token": "[ID_TOKEN]", "state": "[STATE]" }, "user": { "email": "[EMAIL]", "name": { "firstName": "[FIRST_NAME]", "lastName": "[LAST_NAME]" } } }
实际返回数据:
{ "authorization": { "code": "[CODE]", "id_token": "[TOKEN]", "state": "[DATE]" }, "userData": { "iss": "https://appleid.apple.com", "aud": "[CLIENT ID]", "exp": 1705410345, "iat": 1705323945, "sub": "001444.684e7c6273564b439b17498e791080d6.0659", "c_hash": "a-ronQDp7RZtub_FJ-pceQ", "email": "[MY EMAIL]", "email_verified": "true", "auth_time": 1705323945, "nonce_supported": true } }
我的配置代码:
nuxtApp.vueApp.use(VueAppleLogin, { clientId: config.public.appleClientId, scope: "name email", redirectURI: "[REDIRECT URI]", state: time.toString(), usePopup: true, });
解决方案
1. 这是Apple的默认规则:仅首次授权返回name字段
Apple的Sign in with Apple机制里,只有用户第一次给你的应用授权时,才会返回name字段。如果用户之前已经授权过(哪怕是同一设备、同一Apple ID),后续所有授权请求都不会再返回name信息,哪怕你指定了name scope。
解决方法:
- 去苹果设备的「设置」→「Apple ID」→「密码与安全性」→「使用Apple ID的应用」,找到你的应用并删除授权。
- 重新发起登录授权,这次就能拿到
name字段了。
2. 检查组件是否正确处理了返回数据
你用的VueAppleLogin组件在弹窗模式(usePopup: true)下,可能把user信息单独放在了回调参数里,而不是和authorization、解码后的id_token混在一起。比如:
// 检查组件的success回调 onSuccess(response) { // 可能response里有单独的user字段 console.log(response.user); // 这里可能包含name和email }
你的实际返回里只有authorization和userData(ID Token解码结果),大概率是组件只提取了这两部分,没把Apple返回的user对象带回来。
3. 持久化存储name字段
一旦拿到用户的name信息,一定要立刻存储到你的后端数据库里。因为后续用户登录时Apple不会再返回这个字段,你只能从自己的数据库里读取。
4. 确认scope参数是否正确传递
虽然你配置了scope: "name email",但要确认组件是否真的把这个参数传给了Apple的授权接口。可以打开浏览器开发者工具,查看授权请求的URL里是否包含scope=name%20email参数。
内容的提问来源于stack exchange,提问作者Azamat
相关产品推荐
相关产品推荐

