SpringBoot 3.x集成Google OAuth2无法获取自定义用户属性问题
SpringBoot 3.x Google OAuth2无法获取自定义用户属性的解决办法
问题根源
Google OAuth2默认调用的https://www.googleapis.com/oauth2/v3/userinfo接口仅返回标准用户Claims(比如sub、name、email等),你在管理控制台添加的自定义用户属性并不在这个接口的返回范围内——这类属性存储在Google People API或Admin SDK的专属端点中,默认登录流程不会自动请求这些接口。
解决步骤
补充权限范围
要获取自定义属性,必须在SpringBoot OAuth2配置中添加对应API的权限范围:- 若为域内用户,需添加
https://www.googleapis.com/auth/admin.directory.user.readonly(需域管理员提前授权应用使用该权限); - 若为普通Google账号用户,需添加People API相关权限,比如
https://www.googleapis.com/auth/userinfo.profile(需确保权限覆盖自定义属性的读取范围)。
- 若为域内用户,需添加
自定义OAuth2UserService扩展逻辑
默认的DefaultOAuth2UserService只会调用userinfo接口,你需要自定义实现类,在拿到access_token后额外调用对应API获取自定义属性,并合并到OAuth2User的属性集合中:@Service public class CustomGoogleOAuth2UserService extends DefaultOAuth2UserService { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { // 先获取默认的标准用户信息 OAuth2User defaultUser = super.loadUser(userRequest); String accessToken = userRequest.getAccessToken().getTokenValue(); // 调用Google People API获取自定义属性(以customFields为例) RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setBearerAuth(accessToken); HttpEntity<Void> requestEntity = new HttpEntity<>(headers); // 注意personFields参数需明确指定要获取的自定义字段 ResponseEntity<String> apiResponse = restTemplate.exchange( "https://people.googleapis.com/v1/people/me?personFields=customFields", HttpMethod.GET, requestEntity, String.class ); // 解析响应并合并到原有属性中 Map<String, Object> mergedAttributes = new HashMap<>(defaultUser.getAttributes()); JSONObject customFieldsJson = new JSONObject(apiResponse.getBody()).optJSONObject("customFields"); if (customFieldsJson != null) { mergedAttributes.put("custom_user_attributes", customFieldsJson); } return new DefaultOAuth2User(defaultUser.getAuthorities(), mergedAttributes, "sub"); } }之后在Security配置中注册这个自定义服务:
securityBuilder.oauth2Login(oauth2 -> oauth2 .successHandler(authenticationSuccessHandler) .userInfoEndpoint(endpoint -> endpoint.userService(customGoogleOAuth2UserService)));核对控制台配置与权限授权
- 确认自定义属性已正确关联到目标用户账号;
- 若使用Admin SDK权限,需确保域管理员已在Google管理控制台中授权你的OAuth应用访问该权限;
- 权限变更后,需让用户重新授权应用,确保新的access_token包含所需权限。
内容的提问来源于stack exchange,提问作者user2095071
相关产品推荐
相关产品推荐

