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

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

1. 概要

このクイックチュートリアルでは、add logout functionality to an OAuth Spring Security applicationを実行する方法を示します。

もちろん、前の記事で説明したOAuthアプリケーション–Creating a REST API with OAuth2を使用します。

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

簡単に言うと、OAuthで保護された環境でのログアウトにはrendering the user’s Access Token invalidが含まれるため、使用できなくなります。

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

トークンの削除操作を実装しましょう。 ここでは、予備の/oauth/token URL構造を使用して、新しいDELETE操作を導入します。

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

代わりに、これを@FrameworkEndpoint –として定義して、標準のRequestMappingHandlerMappingではなくFrameworkEndpointHandlerMappingによって取得および解決されるようにする必要があります。 そうすれば、部分的な一致に遭遇したり、競合したりすることはありません。

@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. 更新トークンを削除します

Handling the Refresh Tokenに関する前回の記事では、更新トークンを使用してアクセストークンを更新できるようにアプリケーションを設定しました。 この実装では、Zuulプロキシを使用します–CustomPostZuulFilterを使用して、承認サーバーから受信したrefresh_token値をrefreshTokenCookieに追加します。

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

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

@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_tokenCookieもクライアント側から削除する必要があります。

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

$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リンクをクリックすると呼び出されます。

5. 結論

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

例の完全なソースコードはover on GitHubにあります。