6

내 응용 프로그램에 OAuth2를 사용하려고합니다. 다음과 같이 내가 구현하기 위해 노력하고있어 아키텍처는 다음과 같습니다스프링 부트 OAuth2 싱글 로그 오프 (로그 아웃)

  • 난 내 자신의 (만이) 인증 서버해야합니다
  • 일부 클라이언트 권한 부여 서버를 사용하여 리소스에 대한 액세스를 확인하는
  • 일부 자원 앱 인증을 위해 사용자를 권한 부여 서버로 리디렉션하는 앱 (웹, 모바일)은 성공하면 API의 자원 응용 프로그램을 사용합니다.

지금까지 나는 3 개의 기본 응용 프로그램 (1 개의 인증 서버, 1 개의 자원 서버 및 1 개의 클라이언트) 사이에서이 상호 작용을 구현했습니다. 내가 작동하지 않는 것은 로그 아웃 기능입니다. Dave Syer가 자신의 자습서에서 설명한 "notoriously tricky problem"을 읽었지 만,이 경우 로그 아웃 후 다시 로그인해야합니다. 액세스 토큰과 새로 고침 토큰을 몇 초 동안 보내려고했지만 만료시 다시 로그인하라는 메시지가 표시되지 않고 클라이언트 응용 프로그램에서 NPE가 표시됩니다. 또한이 post에서 제안 된 솔루션을 토큰 저장소에서 토큰을 제거하려고 시도했지만 작동하지 않습니다. 싱글 사인 오프는이 구현에서 바람직한 행동입니다. Spring Boot Oauth2를 사용하여 어떻게 이것을 할 수 있습니까? 어떤 이유로 든 가능하지 않다면 스프링 부트를 사용하여 중앙 집중식 보안을 구현하는 데 사용할 수있는 대안은 무엇입니까?

미리 감사드립니다.

답변

7

후 나는 이것이 AuthServer로 리디렉션으로 만 해결과 같은 프로그램 로그 아웃을 수행 할 수 있다는 것을 깨달았다 테스트의 많은 : 클라이언트 응용 프로그램에서

  • (WebSecurityConfigurerAdapter) :

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
        http 
          .logout() 
          .logoutSuccessUrl("http://your-auth-server/exit"); 
    } 
    
    인증 서버에서
  • :

    @Controller 
    public class LogoutController { 
    
        @RequestMapping("/exit") 
        public void exit(HttpServletRequest request, HttpServletResponse response) { 
         // token can be revoked here if needed 
         new SecurityContextLogoutHandler().logout(request, null, null); 
         try { 
          //sending back to client app 
          response.sendRedirect(request.getHeader("referer")); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    } 
    

나는이 구현의 전체 예제를 가지고 sample app on github을 올렸습니다.

+1

이 간단한 대답을 통해 간단한 해결책을 얻을 수있었습니다. –

+0

이 코드는 무엇을하고 있습니까? 클라이언트 응용 프로그램 (웹 사이트)에서 로그 아웃하면 하나의 인증 서버에서 사용자가 로그 아웃됩니까? 사용자가 여러 클라이언트 응용 프로그램에 로그인했을 때 그 중 하나에서 로그 아웃하면 모든 클라이언트 응용 프로그램에서 로그 아웃하게됩니다. – eugene

+0

@eugene 나는이 솔루션을 2 개의 클라이언트 응용 프로그램을 사용하여 테스트했으며 하나에서 로그 아웃하면 다른 클라이언트에 영향을주지 않습니다. 이 솔루션의 기능은 로그 아웃을 클릭 한 다음 다시 로그인을 클릭하면 자격 증명을 다시 입력해야한다는 것입니다. [ "악명 높은 까다로운 문제"] (https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v#)를 해결할 대안이 있습니까? 로그 아웃 경험). –