web-dev-qa-db-fra.com

Déconnexion unique OAuth2 de Spring Boot (déconnexion)

J'envisage d'utiliser OAuth2 pour mon application. L'architecture que j'essaie de mettre en œuvre est la suivante:

  • J'aurai mon propre (et seulement ce) serveur d'autorisation
  • Certaines applications de ressources validant l'accès à leurs ressources à l'aide du serveur d'autorisation
  • Certaines applications clientes (Web, mobiles) qui redirigeront l'utilisateur vers le serveur d'autorisation pour l'authentification et, en cas de succès, consommeront les API sur les applications de ressources.

Jusqu'à présent, j'ai réussi à mettre en œuvre cette interaction entre 3 applications de base (1 serveur d'authentification, 1 serveur de ressources et 1 client). La chose que je ne fais pas fonctionner, c'est la fonctionnalité de déconnexion. J'ai lu le "problème notoirement délicat" que Dave Syer décrit dans son tutoriel, mais dans ce cas, j'ai vraiment besoin que l'utilisateur se reconnecte après la déconnexion. J'ai essayé de donner quelques secondes au jeton d'accès et au jeton d'actualisation, mais au lieu d'être invité à me connecter à nouveau à l'expiration, j'obtiens un NPE sur l'application cliente. J'ai également essayé les solutions proposées dans ce post pour supprimer le jeton du magasin de jetons, mais cela ne fonctionne pas. La signature unique est pour moi le comportement souhaitable pour cette implémentation. Comment puis-je y parvenir en utilisant Spring Boot Oauth2. Si ce n'est pas possible pour une raison quelconque, quelles alternatives pourrais-je utiliser pour implémenter une sécurité centralisée à l'aide de Spring Boot?

Merci d'avance.

12

Après de nombreux tests, j'ai réalisé que cela peut être résolu simplement avec une redirection vers AuthServer et en faisant la déconnexion par programme comme ceci:

  • Dans l'application client (WebSecurityConfigurerAdapter):

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .logout()
                .logoutSuccessUrl("http://your-auth-server/exit");
    }
    
  • Sur le serveur d'autorisation:

    @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();
            }
        }
    }
    

J'ai posté un exemple d'application sur github avec un exemple complet de cette implémentation.

17