如何在Google oauth后使用Spring Boot重定向到特定的uri



我正在使用Spring Boot实现一个服务器。在用户执行oauth登录后,我希望将用户重定向到特定的uri,以便让用户注册或登录。谷歌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,而是重定向到"/"

NEW:我通过拥有. defaultsuccessurl()重定向了它,但现在DefaultOAuth2User没有与重定向一起发送,导致重定向api的参数为空。如何解决这个问题?

尝试使用

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

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

Spring-SecurityAbstractAuthenticationProcessingFilter类有successfulAuthentication()方法,它定义了当用户成功通过身份验证时发生的事情。你可以注册你的成功处理器,并把你的重定向逻辑放在那里。

但是这里有一个问题,当使用OAuth2.0时,我们需要指定redirect-uri,在客户端接收到access-token后,哪个用户将被登陆。

如果你对这个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");
}
})
}

最新更新