OAuthで保護されたアプリケーションでのログアウト

1概要

このクイックチュートリアルでは、OAuth Spring Securityアプリケーションにログアウト機能を追加する方法を説明します。

もちろん、以前の記事link/rest-api-spring-oauth2-angularjs[OAuth2を使用したREST APIの作成]で説明したOAuthアプリケーションを使用します。

2アクセストークンを削除する

簡単に言うと、OAuthで保護された環境でログアウトするには、ユーザーのアクセストークンを無効にする必要があります。

__JdbcTokenStoreベースの実装では、これは TokenStore__からトークンを削除することを意味します。

トークンの削除操作を実装しましょう。ここでは、プライマリの__/oauth/token URL構造を使用し、それに新しいDELETE操作を導入します。

さて、ここでは /oauth/token URIを実際に使用しているので、慎重に処理する必要があります。 POSTとGETを使用すると、フレームワークにはすでにそのURIにマッピングされた操作があるため、これを任意のコントローラに単純に追加することはできません。

その代わりに、標準の RequestMappingHandlerMapping ではなく FrameworkEndpointHandlerMapping によって取得され解決されるように、これを @ FrameworkEndpoint – と定義することで代わりに行う必要があります。そのようにして、我々はどんな部分的なマッチにも遭遇することがなく、そしていかなる衝突も起こさない。

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

単純に標準の Authorization ヘッダーを使用して、リクエストからトークンを抽出する方法に注目してください。

3更新トークンを削除する

/spring-security-oauth2-refresh-token-angular-js[リフレッシュトークンの処理]では、リフレッシュトークンを使用してアクセストークンをリフレッシュできるようにアプリケーションを設定しました。この実装はZuulプロキシを利用します。CustomPostZuulFilter と共に認可サーバーから受け取った refresh token 値を refreshToken クッキーに追加します。

前のセクションで示したように、アクセストークンを無効にすると、それに関連付けられている更新トークンも無効になります。ただし、JavaScriptを使用してCookieを削除することはできないため、 httpOnly Cookieはクライアントに設定されたままになるため、サーバー側から削除する必要があります。

/oauth/token/revoke URLをインターセプトする CustomPostZuulFilter 実装を拡張して、このURLに遭遇したときに refreshToken cookieが削除されるようにします。

@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 AngularJSクライアントからアクセストークンを削除する

トークンストアからアクセストークンを取り消すことに加えて、 access token__ cookieもクライアント側から削除する必要があります。

AngularJS コントローラーに access token cookieをクリアし、 /oauth/token/revoke__DELETEマッピングを呼び出すメソッドを追加しましょう。

$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");
        }
    );
}

この関数は Logout リンクをクリックすると呼び出されます。

<a class="btn btn-info" href="#" ng-click="logout()">Logout</a>

5結論

この迅速で詳細なチュートリアルでは、 AAuth セキュリティで保護されたアプリケーションからユーザーをログアウトし、そのユーザーのトークンを無効にする方法を説明しました。

例の完全なソースコードはhttps://github.com/Baeldung/spring-security-oauth[over on GitHub]にあります。

前の投稿:Java WatchService APIとApache Commons IO Monitorライブラリの違い
次の投稿:SpringのStreamUtilsの紹介