Logout in einer OAuth-gesicherten Anwendung

Melden Sie sich in einer OAuth Secured-Anwendung ab

1. Überblick

In diesem kurzen Tutorial zeigen wir, wie wiradd logout functionality to an OAuth Spring Security application können.

Wir werden natürlich die in einem vorherigen Artikel beschriebene OAuth-Anwendung verwenden -Creating a REST API with OAuth2.

2. Entfernen Sie das Zugriffstoken

Einfach ausgedrückt bedeutet das Abmelden in einer OAuth-gesicherten Umgebungrendering the user’s Access Token invalid - daher kann es nicht mehr verwendet werden.

In einerJdbcTokenStore--basierten Implementierung bedeutet dies, dass das Token ausTokenStore entfernt wird.

Implementieren wir einen Löschvorgang für das Token. Wir werden hier die URL-Struktur des Parimary/oauth/tokenverwenden und einfach eine neue DELETE-Operation dafür einführen.

Da wir hier tatsächlich den URI von/oauth/tokenverwenden, müssen wir sorgfältig damit umgehen. Wir können dies nicht einfach mit POST und GET zu einem Controller hinzufügen, da dem Framework bereits Operationen zugeordnet sind, die diesem URI zugeordnet sind.

Stattdessen müssen wir definieren, dass dies ein@FrameworkEndpoint – ist, damit es von denFrameworkEndpointHandlerMapping anstelle der StandardRequestMappingHandlerMapping aufgenommen und aufgelöst wird. Auf diese Weise stoßen wir nicht auf Teilspiele und haben keine Konflikte:

@FrameworkEndpoint
public class RevokeTokenEndpoint {

    @Resource(name = "tokenServices")
    ConsumerTokenServices tokenServices;

    @RequestMapping(method = RequestMethod.DELETE, value = "/oauth/token")
    @ResponseBody
    public void revokeToken(HttpServletRequest request) {
        String authorization = request.getHeader("Authorization");
        if (authorization != null && authorization.contains("Bearer")){
            String tokenId = authorization.substring("Bearer".length()+1);
            tokenServices.revokeToken(tokenId);
        }
    }
}

Beachten Sie, wie wir das Token aus der Anforderung extrahieren, indem Sie einfach den Standard-HeaderAuthorizationverwenden.

3. Entfernen Sie das Aktualisierungstoken

In einem früheren Artikel zuHandling the Refresh Token haben wir unsere Anwendung so eingerichtet, dass das Zugriffstoken mithilfe eines Aktualisierungstokens aktualisiert werden kann. Diese Implementierung verwendet einen Zuul-Proxy - mit einemCustomPostZuulFilter, um den vom Authorization Server empfangenenrefresh_token-Wert zu einemrefreshToken-Cookie hinzuzufügen.

Wenn Sie das Zugriffstoken widerrufen, wie im vorherigen Abschnitt gezeigt, wird das damit verknüpfte Aktualisierungstoken ebenfalls ungültig. DashttpOnly-Cookie bleibt jedoch auf dem Client gesetzt, da wir es nicht über JavaScript entfernen können. Daher müssen wir es von der Serverseite entfernen.

Lassen Sie uns die Implementierung vonCustomPostZuulFilterverbessern, die die URL von/oauth/token/revokeabfängt, sodass das Cookie vonrefreshTokenentfernt wird, wenn diese URL auftritt:

@Component
public class CustomPostZuulFilter extends ZuulFilter {
    //...
    @Override
    public Object run() {
        //...
        String requestMethod = ctx.getRequest().getMethod();
        if (requestURI.contains("oauth/token") && requestMethod.equals("DELETE")) {
            Cookie cookie = new Cookie("refreshToken", "");
            cookie.setMaxAge(0);
            cookie.setPath(ctx.getRequest().getContextPath() + "/oauth/token");
            ctx.getResponse().addCookie(cookie);
        }
        //...
    }
}

4. Entfernen Sie das Zugriffstoken vom AngularJS-Client

Neben dem Widerruf des Zugriffstokens aus dem Token-Speicher muss das Cookieaccess_tokenauch von der Clientseite entfernt werden.

Fügen wir unseremAngularJS-Controller eine Methode hinzu, die dasaccess_token-Cookie löscht und die/oauth/token/revoke-DELETE-Zuordnung aufruft:

$scope.logout = function() {
    logout($scope.loginData);
}
function logout(params) {
    var req = {
        method: 'DELETE',
        url: "oauth/token"
    }
    $http(req).then(
        function(data){
            $cookies.remove("access_token");
            window.location.href="login";
        },function(){
            console.log("error");
        }
    );
}

Diese Funktion wird aufgerufen, wenn Sie auf den LinkLogoutklicken:

5. Fazit

In diesem kurzen, aber ausführlichen Tutorial haben wir gezeigt, wie wir einen Benutzer von einerOAuthgesicherten Anwendung abmelden und die Token dieses Benutzers ungültig machen können.

Der vollständige Quellcode der Beispiele istover on GitHub.