如何在Spring登录时正确获取Coinbase OAuth2用户属性?
解决Coinbase OAuth2用户信息嵌套在"data"字段的问题
针对Coinbase用户信息接口返回数据嵌套在data字段的问题,你可以用以下两种方法解决:
方法1:自定义OAuth2UserService
继承DefaultOAuth2UserService,重写loadUser方法手动提取真实用户属性:
public class CoinbaseOAuth2UserService extends DefaultOAuth2UserService { @Override public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(userRequest); // 从顶层属性中取出data字段对应的真实用户属性 Map<String, Object> realUserAttributes = (Map<String, Object>) oAuth2User.getAttributes().get("data"); // 用真实属性构建OAuth2User,最后一个参数指定用作用户名的属性名(比如id、name或email) return new DefaultOAuth2User( oAuth2User.getAuthorities(), realUserAttributes, "id"); } }
在SecurityFilterChain中配置自定义Service:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .oauth2Login(oauth2 -> oauth2 .userInfoEndpoint(userInfo -> userInfo .userService(new CoinbaseOAuth2UserService()) ) ); return http.build(); }
方法2:使用UserAttributeMapper轻量处理
不需要自定义Service,直接通过userAttributeMapper转换属性:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .oauth2Login(oauth2 -> oauth2 .userInfoEndpoint(userInfo -> userInfo .userAttributeMapper(attributes -> { // 提取data字段下的真实用户属性 Map<String, Object> coinbaseUserAttrs = (Map<String, Object>) attributes.get("data"); return coinbaseUserAttrs != null ? coinbaseUserAttrs : attributes; }) // 设置实际用作用户名的属性名 .userNameAttributeName("id") ) ); return http.build(); }
两种方法都能解决属性嵌套问题:方法2更简洁,适合仅需提取属性的场景;方法1适合需要额外处理用户数据(比如字段转换、添加自定义权限)的场景。此时你可以将CB_USER_NAME_ATTRIBUTE_NAME设置为实际需要的属性名(如id、name),无需再设为data。
内容的提问来源于stack exchange,提问作者Gary Kephart
相关产品推荐
相关产品推荐

