dnd-side-project / dnd-11th-7-backend

모두의 일정을 한눈에! 간편한 일정 조율 서비스, 째깍
12 stars 1 forks source link

로그인 처리 후 리다이렉트 URL 수정 #105

Closed f1v3-dev closed 1 month ago

f1v3-dev commented 1 month ago

🛠️ 어떤 기능인가요?

현재 상황

  1. 클라이언트가 /api/v1/auth/oauth/kakao 로 API 요청
  2. 요청에 대해 카카오 로그인 페이지를 보여줌
  3. 로그인이 성공했을 경우, OAuth2SuccessHandler 를 통해 frontURL + "/login/sucess" 로 리다이렉트 진행

요구사항

위의 과정에서 1번을 요청할 때 쿼리 파라미터?value=something 요청으로 보낸 후
3번 과정 마지막에 리다이렉트 URL에도 같이 붙여서 (frontURL + "/login/success?value=something") 으로 변경

🗒️ 작업 상세 내용

👀 참고할만한 자료(선택)

f1v3-dev commented 1 month ago

로그인 전체 흐름

RTUnu12 commented 1 month ago

이게 컨트롤러를 써서 하는게 아니라 security 설정을 통해서 하는거라 까다롭지 않나요?

f1v3-dev commented 1 month ago

이게 컨트롤러를 써서 하는게 아니라 security 설정을 통해서 하는거라 까다롭지 않나요?

네 맞아요 지금 찾아보니까 커스터마이징을 해서 카카오 로그인 요청에다가 붙여야되는 방식인거같은데 지금 생각대로라면 직접 구현해야할 수준이여서..

가능하다면 프론트 측에서 버튼 클릭시 쿠키를 생성해서 redirect_url 을 넘겨주고, 그걸 백엔드 측에서 쿠키가 있다면 까서 붙여주는 방식은 어떨까? 라고 생각중이에요

RTUnu12 commented 1 month ago

오호 좋은 생각인데요?

RTUnu12 commented 1 month ago

아님 리다이렉트 설정하는 부분에 람다식으로 추가하는건 어때요?

이때 추가하는건 쿠키같은걸로

f1v3-dev commented 1 month ago

찾게된 계기

챗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 << 이게 처리를 해주는건데 자세한 내용은 블로그 참고해보시면 좋을 것 같아요 (블로그 글 중 예문)

image

본론

아무튼 해당 리졸버를 커스터마이징 해서 /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)

RTUnu12 commented 1 month ago

결국 해답을 찾아냈네요...개쩐다

f1v3-dev commented 1 month ago

ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 오늘 제가 작업하고 PR 올려놓을게여 혹시 궁금한거 있으면 같이 찾아봐요 저도 자세한 동작 과정을 알고있는게 아니라서