Spring OAuth2 名称始终为 null

问题描述 投票:0回答:2

OAuth2 和 Spring 框架的新功能。到目前为止,已经遵循了两个介绍指南(例如 this 一个),并且

OAuth2User
对象 (org.springframework.security.oauth2.core.user.OAuth2User) 的“name”属性始终具有 null 值,如下教程所示,显然不应为空。最终克隆存储库只是为了确保我有相同的代码并且值仍然为空。

@SpringBootApplication
@RestController
public class SocialApplication extends WebSecurityConfigurerAdapter {

    @GetMapping("/user")
    public Map<String, Object> user(@AuthenticationPrincipal OAuth2User principal) {
        
//      for(String key : principal.getAttributes().keySet()) {
//          System.out.println(String.format("key= %s value=%s", key, principal.getAttribute(key)));
//      }
        return Collections.singletonMap("name", principal.getAttribute("name"));
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
            .authorizeRequests(a -> a
                .antMatchers("/", "/error", "/webjars/**").permitAll()
                .anyRequest().authenticated()
            )
            .exceptionHandling(e -> e
                .authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED))
            )
            .oauth2Login();
        // @formatter:on
    }

    public static void main(String[] args) {
        SpringApplication.run(SocialApplication.class, args);
    }

}

    }

    public static void main(String[] args) {
        SpringApplication.run(SocialApplication.class, args);
    }
}

取消注释上面的 for 循环将从

principle.getAttributes()
获取的大多数键都为空(包括 nameemail 等)。我不清楚我在这里做错了什么 - 我在我的属性文件中正确配置了 clientId 和 clientSecret (通过创建 github OAuth 应用程序获得)。任何帮助将不胜感激

java spring oauth-2.0
2个回答
1
投票

我遇到了同样的问题,我通过访问我的 github 个人资料并更新我的名字解决了它(在我的例子中我没有提供它)!


0
投票

我在使用谷歌登录时也面临同样的问题。有人有解决办法吗?我遵循同样的步骤

    @GetMapping("/loginSuccess")
public String loginSuccess(@AuthenticationPrincipal OAuth2User oauthUser) {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    System.out.println("Authentication principal: " + authentication.getPrincipal());

    if (oauthUser == null) {
        return "Error: OAuth2User is null. Authentication failed.";
    }
    String username = oauthUser.getAttribute("name");
    JwtToken jwtToken = jwtUtils.generateTokenFromUsername(username);
    return "Login successful! JWT Token: " + jwtToken;
}

这是我的安全配置

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> {
                auth.requestMatchers(
                                antMatcher("/api/auth/**"),
                                antMatcher("/oauth2/**"),
                                antMatcher("/login/**")
                        ).permitAll()
                        .anyRequest().authenticated();
            })
            .oauth2Login(oauth2 -> oauth2
                    .defaultSuccessUrl("/api/auth/loginSuccess")
                    .failureUrl("/api/auth/loginFailure")
            )
            .httpBasic()
            .and()
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .exceptionHandling()
            .authenticationEntryPoint(unauthorizedHandler)
            .and()
            .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class)
            .authenticationProvider(authenticationProvider());
    return http.build();
}
© www.soinside.com 2019 - 2024. All rights reserved.