Skip to content

Commit 42ac054

Browse files
author
sampadawagde
committed
JAVA-413: Logout Using Zuul proxy
1 parent 63e61df commit 42ac054

File tree

4 files changed

+79
-36
lines changed

4 files changed

+79
-36
lines changed

oauth-rest/oauth-ui-authorization-code-angular-zuul/src/main/java/com/baeldung/config/CustomPostZuulFilter.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,38 @@ public Object run() {
3636
final Cookie cookie = new Cookie("code", params.get("code").get(0));
3737
cookie.setHttpOnly(true);
3838
cookie.setPath(ctx.getRequest().getContextPath() + "/auth/token");
39-
//cookie.setMaxAge(2592000); // 30 days
39+
cookie.setMaxAge(2592000); // 30 days
4040

4141
ctx.getResponse().addCookie(cookie);
42-
43-
} else if (requestURI.contains("auth/token") || requestURI.contains("auth/refresh")) {
4442

45-
final InputStream is = ctx.getResponseDataStream();
46-
String responseBody = IOUtils.toString(is, "UTF-8");
47-
if (responseBody.contains("refresh_token")) {
48-
final Map<String, Object> responseMap = mapper.readValue(responseBody,
49-
new TypeReference<Map<String, Object>>() {
50-
});
51-
final String refreshToken = responseMap.get("refresh_token").toString();
52-
responseMap.remove("refresh_token");
53-
responseBody = mapper.writeValueAsString(responseMap);
54-
55-
final Cookie cookie = new Cookie("refreshToken", refreshToken);
56-
cookie.setHttpOnly(true);
57-
cookie.setPath(ctx.getRequest().getContextPath() + "/auth/refresh");
58-
cookie.setMaxAge(2592000); // 30 days
43+
} else if (requestURI.contains("auth/token") || requestURI.contains("auth/refresh")) {
44+
if (requestURI.contains("auth/refresh/revoke")) {
5945

46+
final Cookie cookie = new Cookie("refreshToken", "");
47+
cookie.setMaxAge(0);
6048
ctx.getResponse().addCookie(cookie);
49+
} else {
50+
final InputStream is = ctx.getResponseDataStream();
51+
String responseBody = IOUtils.toString(is, "UTF-8");
52+
if (responseBody.contains("refresh_token")) {
53+
final Map<String, Object> responseMap = mapper.readValue(responseBody,
54+
new TypeReference<Map<String, Object>>() {
55+
});
56+
final String refreshToken = responseMap.get("refresh_token").toString();
57+
responseMap.remove("refresh_token");
58+
responseBody = mapper.writeValueAsString(responseMap);
59+
60+
final Cookie cookie = new Cookie("refreshToken", refreshToken);
61+
cookie.setHttpOnly(true);
62+
cookie.setPath(ctx.getRequest().getContextPath() + "/auth/refresh");
63+
cookie.setMaxAge(2592000); // 30 days
64+
65+
ctx.getResponse().addCookie(cookie);
66+
}
67+
ctx.setResponseBody(responseBody);
6168
}
62-
ctx.setResponseBody(responseBody);
63-
}
6469

70+
}
6571
} catch (Exception e) {
6672
logger.error("Error occured in zuul post filter", e);
6773
}

oauth-rest/oauth-ui-authorization-code-angular-zuul/src/main/java/com/baeldung/config/CustomPreZuulFilter.java

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.baeldung.config;
22

33
import java.io.IOException;
4+
import java.net.URL;
45
import java.util.List;
56
import java.util.Map;
67

@@ -9,6 +10,10 @@
910

1011
import org.slf4j.Logger;
1112
import org.slf4j.LoggerFactory;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
15+
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute;
16+
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
1217
import org.springframework.stereotype.Component;
1318

1419
import com.google.common.collect.Lists;
@@ -19,6 +24,9 @@
1924
@Component
2025
public class CustomPreZuulFilter extends ZuulFilter {
2126

27+
@Autowired
28+
private ZuulProperties zuulProperties;
29+
2230
private final Logger logger = LoggerFactory.getLogger(this.getClass());
2331
private final static String REDIRECT_URL = "http://localhost:8089/auth/redirect/";
2432
private final static String CLIENT_ID = "newClient";
@@ -44,21 +52,30 @@ public Object run() {
4452

4553
ctx.setRequestQueryParams(params);
4654
} else if (requestURI.contains("auth/token") || requestURI.contains("auth/refresh")) {
47-
4855
try {
49-
String cookieValue = requestURI.contains("token") ? extractCookie(req, "code")
50-
: extractCookie(req, "refreshToken");
51-
52-
String formParams = createFormData(requestURI, cookieValue);
53-
54-
byte[] bytes = formParams.getBytes("UTF-8");
55-
56+
byte[] bytes;
57+
if (requestURI.contains("auth/refresh/revoke")) {
58+
final String proxy = (String) ctx.get(FilterConstants.PROXY_KEY);
59+
final ZuulRoute zuulRoute = this.zuulProperties.getRoutes().get(proxy + "revoke");
60+
61+
ctx.put(FilterConstants.REQUEST_URI_KEY, "");
62+
ctx.setRouteHost(new URL(zuulRoute.getUrl()));
63+
64+
String cookieValue = extractCookie(req, "refreshToken");
65+
String formParams = createFormData(requestURI, cookieValue);
66+
bytes = formParams.getBytes("UTF-8");
67+
} else {
68+
String cookieValue = requestURI.contains("token") ? extractCookie(req, "code")
69+
: extractCookie(req, "refreshToken");
70+
String formParams = createFormData(requestURI, cookieValue);
71+
bytes = formParams.getBytes("UTF-8");
72+
}
5673
ctx.setRequest(new CustomHttpServletRequest(req, bytes));
57-
5874
} catch (IOException e) {
5975
e.printStackTrace();
6076
}
61-
}
77+
78+
}
6279
return null;
6380
}
6481

@@ -75,13 +92,19 @@ private String extractCookie(HttpServletRequest req, String name) {
7592
}
7693

7794
private String createFormData(String requestURI, String cookieValue) {
78-
String formData;
95+
String formData = "";
7996
if (requestURI.contains("token")) {
8097
formData = String.format("grant_type=%s&client_id=%s&client_secret=%s&redirect_uri=%s&code=%s",
8198
"authorization_code", CLIENT_ID, CLIENT_SECRET, REDIRECT_URL, cookieValue);
82-
} else {
83-
formData = String.format("grant_type=%s&client_id=%s&client_secret=%s&refresh_token=%s", "refresh_token",
84-
CLIENT_ID, CLIENT_SECRET, cookieValue);
99+
} else if (requestURI.contains("refresh")) {
100+
if (requestURI.contains("revoke")) {
101+
formData = String.format("client_id=%s&client_secret=%s&refresh_token=%s", CLIENT_ID, CLIENT_SECRET,
102+
cookieValue);
103+
} else {
104+
formData = String.format("grant_type=%s&client_id=%s&client_secret=%s&refresh_token=%s",
105+
"refresh_token", CLIENT_ID, CLIENT_SECRET, cookieValue);
106+
}
107+
85108
}
86109
return formData;
87110
}
@@ -101,7 +124,7 @@ public boolean shouldFilter() {
101124

102125
@Override
103126
public int filterOrder() {
104-
return 6;
127+
return FilterConstants.PRE_DECORATION_FILTER_ORDER + 1;
105128
}
106129

107130
@Override

oauth-rest/oauth-ui-authorization-code-angular-zuul/src/main/resources/application.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ zuul:
2222
path: /auth/resources/**
2323
sensitiveHeaders:
2424
url: http://localhost:8083/auth/resources/
25+
auth/refresh/revoke:
26+
path: /auth/refresh/revoke/**
27+
sensitiveHeaders:
28+
url: http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/logout
2529

2630
Servlet30WrapperFilter:
2731
pre:

oauth-rest/oauth-ui-authorization-code-angular-zuul/src/main/resources/src/app/app.service.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,18 @@ export class AppService {
5050
}
5151

5252
logout() {
53-
Cookie.delete('access_token');
54-
window.location.href = 'http://localhost:8089/';
53+
let headers = new HttpHeaders({
54+
'Content-type': 'application/x-www-form-urlencoded; charset=utf-8'
55+
});
56+
57+
this._http.post('auth/refresh/revoke', {}, { headers: headers })
58+
.subscribe(
59+
data => {
60+
Cookie.delete('access_token');
61+
window.location.href = 'http://localhost:8089/';
62+
},
63+
err => alert('Could not logout')
64+
);
5565
}
5666

5767
refreshAccessToken() {

0 commit comments

Comments
 (0)