Spring应用中通过Google OAuth2获取用户手机号与职位方法咨询
解决方案:必须使用Google People API获取手机号和职业信息
是的,你必须通过Google People API来获取用户的手机号和职业(jobTitle),原因如下:
- Google OpenID Connect(OIDC)的标准返回字段(包含在
id_token中,对应DefaultOidcUser对象)仅包含基础信息,比如姓名、邮箱、头像等。手机号和职业并不在OIDC默认返回的字段范围内——哪怕你配置了phone权限范围,也只是获得调用People API的权限,不会直接把这些数据注入到DefaultOidcUser里。
具体实现步骤
在Google Cloud控制台配置权限与API
- 给你的OAuth2客户端启用Google People API;
- 在
application.yml的权限范围(scope)中添加以下权限:https://www.googleapis.com/auth/people.readonly(读取用户基础信息,包含职业)https://www.googleapis.com/auth/user.phonenumbers.read(读取用户手机号)
在Spring应用中调用People API
拿到用户的OAuth2访问令牌(access_token)后,通过HTTP请求调用People API的people/me接口,指定需要返回的字段:// 从SecurityContext获取认证信息 OAuth2AuthenticationToken authToken = (OAuth2AuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); OAuth2AccessToken accessToken = authToken.getAccessToken(); // 构建请求头 HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken.getTokenValue()); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); // 调用People API,指定需要手机号和职业字段 String apiUrl = "https://people.googleapis.com/v1/people/me?personFields=phoneNumbers,occupations"; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<Map> response = restTemplate.exchange(apiUrl, HttpMethod.GET, requestEntity, Map.class); // 解析返回结果 Map<String, Object> userData = response.getBody(); if (userData != null) { // 提取手机号 List<Map<String, Object>> phoneNumbers = (List<Map<String, Object>>) userData.get("phoneNumbers"); if (phoneNumbers != null && !phoneNumbers.isEmpty()) { String phone = (String) phoneNumbers.get(0).get("value"); // 处理手机号 } // 提取职业 List<Map<String, Object>> occupations = (List<Map<String, Object>>) userData.get("occupations"); if (occupations != null && !occupations.isEmpty()) { String jobTitle = (String) occupations.get(0).get("value"); // 处理职业信息 } }注意事项
- 确保用户在授权流程中同意新增的权限范围,否则API会返回403权限不足错误;
- 可以使用
WebClient替代RestTemplate来实现异步请求,更适合Spring WebFlux场景。
内容的提问来源于stack exchange,提问作者Anton Magov
相关产品推荐
相关产品推荐

