ASP.NET Core 6 Identity集成Google登录无法获取手机号与地址
解决ASP.NET Core 6 Identity Google登录无法获取手机号和地址的问题
核心问题原因
Google OAuth2的默认用户信息端点(/oauth2/v2/userinfo)不返回手机号和地址数据,这些信息需要通过People API获取,且需要额外配置API调用和Claim映射规则。
解决方案步骤
1. 在Google Cloud控制台启用People API
进入你的Google Cloud项目,搜索并启用「People API」。未启用该API时,即使添加了权限Scope,也无法获取到手机号和地址数据。
2. 修改Google认证配置,替换用户信息端点并调整Claim映射
默认配置使用的基础用户信息端点不包含目标字段,需要替换为People API的专用端点,并针对其JSON结构调整Claim映射逻辑:
auth.AddGoogle(options => { options.ClientId = googleClientId; options.ClientSecret = googleClientSecret; // 添加手机号和地址读取权限 options.Scope.Add("https://www.googleapis.com/auth/user.phonenumbers.read"); options.Scope.Add("https://www.googleapis.com/auth/user.addresses.read"); // 替换默认用户信息端点为People API,指定需要返回的字段 options.UserInformationEndpoint = "https://people.googleapis.com/v1/people/me?personFields=phoneNumbers,addresses,names,emailAddresses"; // 映射手机号:从phoneNumbers数组中提取第一个有效号码 options.ClaimActions.MapCustomJson(ClaimTypes.MobilePhone, user => user.GetProperty("phoneNumbers")?.EnumerateArray().FirstOrDefault()?.GetProperty("value")?.GetString()); // 映射地址:从addresses数组中提取第一个格式化地址 options.ClaimActions.MapCustomJson(ClaimTypes.StreetAddress, user => user.GetProperty("addresses")?.EnumerateArray().FirstOrDefault()?.GetProperty("formattedValue")?.GetString()); });
注意:
personFields参数必须明确指定要获取的字段,否则People API不会返回对应数据。这里保留了姓名、邮箱字段,确保原有登录功能不受影响。
3. 验证回调中的Claim获取逻辑
在OnGetCallbackAsync中,现在可以正常读取到手机号和地址的Claim值:
var info = await _signInManager.GetExternalLoginInfoAsync(); var phoneNumber = info.Principal.FindFirstValue(ClaimTypes.MobilePhone); var address = info.Principal.FindFirstValue(ClaimTypes.StreetAddress);
额外注意事项
- 确保你的Google账号中填写的手机号和地址为已验证状态,未验证的信息不会被API返回。
- 检查Google Cloud控制台的OAuth consent screen配置,确认已添加
user.phonenumbers.read和user.addresses.read权限Scope,测试阶段需将自己的账号添加为测试用户,正式环境需发布 consent screen。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

