spring 如何在使用Sping Boot 进行Google oauth后重定向到特定的uri

w6lpcovy  于 2023-01-24  发布在  Spring
关注(0)|答案(2)|浏览(178)

我正在使用Sping Boot 实现一个服务器。在用户进行OAuth登录后,我希望用户重定向到一个特定的URI,这样我就可以让用户注册或登录。Google OAuth登录看起来工作正常,但它总是转到"/" URI。我希望用户重定向到"/api/v1/member/oauth"
这是我的Spring Security设置。

...
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .cors()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/swagger-ui/**", "/swagger-resources/**", "/v2/api-docs")
                .permitAll()
                .anyRequest()
                .permitAll()
                .and()
                .oauth2Login()
                .defaultSuccessUrl("/api/v1/member/oauth")
                .userInfoEndpoint()
                .userService(customOAuth2MemberService);
    }
...

这是用户被定向到的OAuth服务。(此操作正常)

@Service
@RequiredArgsConstructor
public class CustomOAuth2MemberService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) {
        OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();

        OAuth2User oAuth2User;

        try {
            oAuth2User = delegate.loadUser(userRequest);
        } catch (OAuth2AuthenticationException e) {
            throw new CustomException(OAUTH_FAIL);
        }

        return new DefaultOAuth2User(oAuth2User.getAuthorities(), oAuth2User.getAttributes(), "sub");
    }
}

我想获取从上面返回到此URI的DefaultOAuth2User。

@PostMapping("/api/v1/member/oauth")
    public Object registerOrLogin(DefaultOAuth2User defaultOAuth2user) {

        return ResponseEntity.status(200)
                .body(DefaultResponseDto.builder()
                        .responseCode("MEMBER_LOGIN")
                        .build());
    }

它当前不指向此URI,而是重定向到"/"

新增:我通过.defaultSuccessUrl()重定向了它,但现在DefaultOAuth2User没有随重定向一起发送,导致重定向API的参数为空。如何解决此问题?

jogvjijk

jogvjijk1#

尝试使用

.oauth2Login()
.defaultSuccessUrl("/api/v1/member/oauth")

这将覆盖认证后的行为,并在成功登录后重定向到所需的页面。此外,还有一个类似的方法来设置失败认证的重定向URL .failureUrl("url")

sf6xfgos

sf6xfgos2#

Spring-Security AbstractAuthenticationProcessingFilter类有successfulAuthentication()方法,它定义了当用户成功通过身份验证时会发生什么。你可以注册你的成功处理程序,并把你的重定向逻辑放在那里。
但这里有一个问题,当使用OAuth2.0时,我们需要指定redirect-uri,在客户端接收到access-token后,用户将登录到该redirect-uri
如果您可以使用此Oauth的redirect-uri,请不要更改成功处理程序中的重定向,或者如果您需要重定向而不考虑这一点,请使用response.sendRedirect("/social-login-sample/some-page");

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .cors()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/swagger-ui/**", "/swagger-resources/**", "/v2/api-docs")
                .permitAll()
                .anyRequest()
                .permitAll()
                .and()
                .oauth2Login()
                .userInfoEndpoint()
                .userService(customOAuth2MemberService)
                .and()
                .successHandler(
                    new AuthenticationSuccessHandler() {

                      @Override
                      public void onAuthenticationSuccess(
                          HttpServletRequest request,
                          HttpServletResponse response,
                          Authentication authentication)
                          throws IOException, ServletException {

                        // authentication.getName() : Principal Name
                        CustomOAuth2User oauthUser = (CustomOAuth2User) authentication.getPrincipal();

                        // Check if user is registered in your Database, if not, register new user
                        //userService.processAuthenticatedUser(oauthUser.getEmail());

                        // Get actual redirect-uri set in OAuth-Provider(Google, Facebook)
                        String redirectUri =
                            UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
                                .replaceQuery(null)
                                .build()
                                .toUriString();

                        log.info("redirectUri: {}", redirectUri);

                        // Ignore redirect-uri, and send user to a different page instead...
                        // response.sendRedirect("/social-login-sample/some-ther-page");
                      }
                    })
    }

相关问题