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にあります。