Closed f1v3-dev closed 1 month ago
(백엔드 URL + "/api/v1/auth/oauth2/kakao")
을 클릭이게 컨트롤러를 써서 하는게 아니라 security 설정을 통해서 하는거라 까다롭지 않나요?
이게 컨트롤러를 써서 하는게 아니라 security 설정을 통해서 하는거라 까다롭지 않나요?
네 맞아요 지금 찾아보니까 커스터마이징을 해서 카카오 로그인 요청에다가 붙여야되는 방식인거같은데 지금 생각대로라면 직접 구현해야할 수준이여서..
가능하다면 프론트 측에서 버튼 클릭시 쿠키를 생성해서 redirect_url 을 넘겨주고, 그걸 백엔드 측에서 쿠키가 있다면 까서 붙여주는 방식은 어떨까? 라고 생각중이에요
오호 좋은 생각인데요?
아님 리다이렉트 설정하는 부분에 람다식으로 추가하는건 어때요?
이때 추가하는건 쿠키같은걸로
챗GPT를 달달 볶으니까 찾게된 것인데
http
// ...
.oauth2Login(oauth2 -> oauth2
.authorizationEndpoint(endpoint -> endpoint
.authorizationRequestResolver(customAuthorizationRequestResolver))
.redirectionEndpoint(endpoint -> endpoint.baseUri("/oauth2/callback/*"))
.userInfoEndpoint(endpoint -> endpoint.userService(oAuth2UserService))
.successHandler(oAuth2SuccessHandler)
.failureHandler(oAuth2FailureHandler)
)
요론식으로 구성되어있는 것 중에서 authorizationEndPoint
내부에서 요청에 대해서 처리하는 방법이 존재하더라구여?
OAuth2AuthorizationRequestResolver << 이게 처리를 해주는건데 자세한 내용은 블로그 참고해보시면 좋을 것 같아요 (블로그 글 중 예문)
아무튼 해당 리졸버를 커스터마이징 해서 /api/v1/auth/oauth2/kakao
로 요청한 것에 대해 다음과 같이 처리를 해주었어요! (코드를 보면 이해가 쉬워보여서 코드를 첨부합니다.)
CustomAuthorizationRequestResolver.java
@Slf4j
@Component
public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
private final OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver;
public CustomAuthorizationRequestResolver(ClientRegistrationRepository clientRegistrationRepository) {
this.defaultAuthorizationRequestResolver =
new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, "/api/v1/auth/oauth2");
}
@Override
public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
OAuth2AuthorizationRequest authorizationRequest = defaultAuthorizationRequestResolver.resolve(request);
return customizeAuthorizationRequest(request, authorizationRequest);
}
@Override
public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
OAuth2AuthorizationRequest authorizationRequest = defaultAuthorizationRequestResolver.resolve(request, clientRegistrationId);
return customizeAuthorizationRequest(request, authorizationRequest);
}
private OAuth2AuthorizationRequest customizeAuthorizationRequest(HttpServletRequest request, OAuth2AuthorizationRequest authorizationRequest) {
log.info("request URL = {}", request.getRequestURI());
if (authorizationRequest == null) {
return null;
}
// 쿼리 파라미터를 추출하고 세션에 저장
String redirect = request.getParameter("redirect");
if (redirect != null) {
request.getSession().setAttribute("redirect_url", redirect);
}
return authorizationRequest;
}
}
구현해야 할 메서드들에 대해서 기존처럼 기본의 구현을 방식을 따르되, 요청에 쿼리 파라미터 redirect
가 존재하면 해당 값을 세션에 저장합니다.
이후에 OAuth2SuccessHandler 에서는 세션에서 값을 꺼내와 redirectURL에 붙여주는 방식으로 하면 될 것 같아요!
참고로, 세션에 저장을 해둔 후 성공/실패 케이스 모두 세션에서 해당 값을 지워주는 작업이 필요하다는 점 (SuccessHandler, FailureHandler)
결국 해답을 찾아냈네요...개쩐다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 오늘 제가 작업하고 PR 올려놓을게여 혹시 궁금한거 있으면 같이 찾아봐요 저도 자세한 동작 과정을 알고있는게 아니라서
🛠️ 어떤 기능인가요?
현재 상황
/api/v1/auth/oauth/kakao
로 API 요청frontURL + "/login/sucess"
로 리다이렉트 진행요구사항
위의 과정에서 1번을 요청할 때 쿼리 파라미터 로
?value=something
요청으로 보낸 후3번 과정 마지막에 리다이렉트 URL에도 같이 붙여서 (
frontURL + "/login/success?value=something"
) 으로 변경🗒️ 작업 상세 내용
👀 참고할만한 자료(선택)