You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring应用中通过Google OAuth2获取用户手机号与职位方法咨询

解决方案:必须使用Google People API获取手机号和职业信息

是的,你必须通过Google People API来获取用户的手机号和职业(jobTitle),原因如下:

  • Google OpenID Connect(OIDC)的标准返回字段(包含在id_token中,对应DefaultOidcUser对象)仅包含基础信息,比如姓名、邮箱、头像等。手机号和职业并不在OIDC默认返回的字段范围内——哪怕你配置了phone权限范围,也只是获得调用People API的权限,不会直接把这些数据注入到DefaultOidcUser里。

具体实现步骤

  1. 在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(读取用户手机号)
  2. 在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");
            // 处理职业信息
        }
    }
    
  3. 注意事项

    • 确保用户在授权流程中同意新增的权限范围,否则API会返回403权限不足错误;
    • 可以使用WebClient替代RestTemplate来实现异步请求,更适合Spring WebFlux场景。

内容的提问来源于stack exchange,提问作者Anton Magov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:50:36