본문 바로가기
Spring-Boot

Flutter + Spring Security + OAuth2 + JWT, 로그인 후 앱으로 redirect 하는 방법

by 준형코딩 2023. 8. 23.

문제

 

Flutter와 Spring Security + OAuth2 + JWT 로그인을 구현하면서 OAuth2 로그인과 access token 발급까지 작동하는데 발급 완료후에 flutter_web_auth를 종료시키고 flutter 앱 화면으로 다시 돌아가게 코드를 짜고 싶었는데 flutter_web_auth에서 400 error만 뜨고 flutter 앱으로 돌아가지 않았다.

 

해결

플러터의 oauth2를 쉽게 도와주는 flutter_web_auth 패키지는

   final result = await FlutterWebAuth.authenticate(
          url: url.toString(), callbackUrlScheme: "candysignal");

아래 코드처럼 callbackUrlScheme을 설정하면 자동으로 oauth2를 완료하면 앱으로 돌아가게 해주는 url이다.

그럼 이 url만 입력하면 되냐? 

아니다. flutter 앱에서 callbackUrlScheme을 설정해주어야한다. 

설정방법은 각각 Ios, Android 다르고 검색하면 나오니 여기서는 다루지 않겠다.

 

그렇게 설정을 완료하고 난 후에 Spring-boot에서 Authentication 성공시 생성된 access token을 담아서 redirect 시켜주는 OAuth2AuthenticationSuccessHandler Class의 redirect 부분을 callbackUrlScheme인 candysignal으로 수정해주어야한다.

처음엔 이것을 몰라서 spring security 설정 부분을 고치기도 하고 redirect url을 수정하면서 헤메었다.

 

    @Override
    public void onAuthenticationSuccess(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response,
                                        Authentication authentication) throws IOException, ServletException {
        String targetUrl = determineTargetUrl(request, response, authentication);

        if (response.isCommitted()) {
            log.debug("Response has already been committed.");
            return;
        }
        clearAuthenticationAttributes( request,  response);

        try{
            getRedirectStrategy().sendRedirect(request, response, "candysignal:"+targetUrl);
            System.out.println("redirect success ");
        }catch(Exception e){
            System.out.println("redirect failed : "+e);
        }

    }

 

이렇게 하면 이제 flutter에서 정상적으로 web_auth 과정을 거치고 앱으로 redirect 되고 candysignal:/?token=토큰값

이런식으로 로그인 시 token값을 받아서 사용할 수 있다.