|
4 | 4 | import java.util.Objects;
|
5 | 5 | import java.util.concurrent.ConcurrentHashMap;
|
6 | 6 | import java.util.concurrent.ConcurrentMap;
|
7 |
| -import java.util.concurrent.ExecutionException; |
8 | 7 |
|
9 | 8 | import org.eclipse.jetty.http.HttpHeader;
|
10 | 9 | import org.eclipse.jetty.http.HttpMethod;
|
@@ -91,60 +90,55 @@ private boolean isContentTypeFormEncoded(Request request)
|
91 | 90 | public AuthenticationState validateRequest(Request request, Response response, Callback callback)
|
92 | 91 | throws ServerAuthException
|
93 | 92 | {
|
94 |
| - try |
| 93 | + |
| 94 | + Fields formFields = FormFields.getFields(request); |
| 95 | + Field logoutTokenField = formFields.get("logout_token"); |
| 96 | + |
| 97 | + if (logoutTokenField == null || logoutTokenField.getValues().size() != 1) |
95 | 98 | {
|
96 |
| - Fields formFields = FormFields.from(request).get(); |
97 |
| - Field logoutTokenField = formFields.get("logout_token"); |
| 99 | + Response.writeError(request, response, callback, HttpStatus.FORBIDDEN_403); |
| 100 | + return AuthenticationState.SEND_FAILURE; |
| 101 | + } |
98 | 102 |
|
99 |
| - if (logoutTokenField == null || logoutTokenField.getValues().size() != 1) |
| 103 | + Algorithm algorithm = Algorithm.RSA256(openIdConfiguration.getRsaKeyProvider()); |
| 104 | + JWTVerifier verifier = JWT.require(algorithm).withIssuer(openIdConfiguration.getIssuer()) |
| 105 | + .withAudience(openIdConfiguration.getClientId()).acceptLeeway(1) |
| 106 | + .withClaim("events", |
| 107 | + (claim, jwt) -> claim.asMap().containsKey("http://schemas.openid.net/event/backchannel-logout")) |
| 108 | + .build(); |
| 109 | + |
| 110 | + try |
| 111 | + { |
| 112 | + DecodedJWT jwt = verifier.verify(logoutTokenField.getValue()); |
| 113 | + if (!jwt.getClaims().containsKey("sub") && !jwt.getClaims().containsKey("sid")) |
100 | 114 | {
|
101 |
| - Response.writeError(request, response, callback, HttpStatus.FORBIDDEN_403); |
| 115 | + logger.warn("Logout Token has no sub and no sid claim"); |
| 116 | + Response.writeError(request, response, callback, HttpStatus.BAD_REQUEST_400); |
102 | 117 | return AuthenticationState.SEND_FAILURE;
|
103 | 118 | }
|
104 | 119 |
|
105 |
| - Algorithm algorithm = Algorithm.RSA256(openIdConfiguration.getRsaKeyProvider()); |
106 |
| - JWTVerifier verifier = JWT.require(algorithm).withIssuer(openIdConfiguration.getIssuer()) |
107 |
| - .withAudience(openIdConfiguration.getClientId()).acceptLeeway(1).withClaim("events", (claim, |
108 |
| - jwt) -> claim.asMap().containsKey("http://schemas.openid.net/event/backchannel-logout")) |
109 |
| - .build(); |
| 120 | + logger.debug("logout token claims: {}", jwt.getClaims()); |
110 | 121 |
|
111 |
| - try |
112 |
| - { |
113 |
| - DecodedJWT jwt = verifier.verify(logoutTokenField.getValue()); |
114 |
| - if (!jwt.getClaims().containsKey("sub") && !jwt.getClaims().containsKey("sid")) |
115 |
| - { |
116 |
| - logger.warn("Logout Token has no sub and no sid claim"); |
117 |
| - Response.writeError(request, response, callback, HttpStatus.BAD_REQUEST_400); |
118 |
| - return AuthenticationState.SEND_FAILURE; |
119 |
| - } |
120 |
| - |
121 |
| - logger.debug("logout token claims: {}", jwt.getClaims()); |
| 122 | + String sub = jwt.getClaim("sub").asString(); |
| 123 | + String sid = jwt.getClaim("sid").asString(); |
122 | 124 |
|
123 |
| - String sub = jwt.getClaim("sub").asString(); |
124 |
| - String sid = jwt.getClaim("sid").asString(); |
| 125 | + logger.debug("Invalidating session for sub/sid {}/{}", sub, sid); |
125 | 126 |
|
126 |
| - logger.debug("Invalidating session for sub/sid {}/{}", sub, sid); |
| 127 | + HttpSession sessionBySub = sessionsBySub.get(sub); |
| 128 | + if (sessionBySub != null) |
| 129 | + sessionBySub.invalidate(); |
127 | 130 |
|
128 |
| - HttpSession sessionBySub = sessionsBySub.get(sub); |
129 |
| - if (sessionBySub != null) |
130 |
| - sessionBySub.invalidate(); |
| 131 | + // session will have been removed if found by sub and invalidated |
| 132 | + HttpSession sessionBySid = sessionsBySid.get(sid); |
| 133 | + if (sessionBySid != null) |
| 134 | + sessionBySid.invalidate(); |
131 | 135 |
|
132 |
| - // session will have been removed if found by sub and invalidated |
133 |
| - HttpSession sessionBySid = sessionsBySid.get(sid); |
134 |
| - if (sessionBySid != null) |
135 |
| - sessionBySid.invalidate(); |
136 |
| - |
137 |
| - return AuthenticationState.SEND_SUCCESS; |
138 |
| - } |
139 |
| - catch (JWTVerificationException e) |
140 |
| - { |
141 |
| - Response.writeError(request, response, callback, HttpStatus.BAD_REQUEST_400); |
142 |
| - return AuthenticationState.SEND_FAILURE; |
143 |
| - } |
| 136 | + return AuthenticationState.SEND_SUCCESS; |
144 | 137 | }
|
145 |
| - catch (InterruptedException | ExecutionException e) |
| 138 | + catch (JWTVerificationException e) |
146 | 139 | {
|
147 |
| - throw new ServerAuthException(e); |
| 140 | + Response.writeError(request, response, callback, HttpStatus.BAD_REQUEST_400); |
| 141 | + return AuthenticationState.SEND_FAILURE; |
148 | 142 | }
|
149 | 143 | }
|
150 | 144 |
|
|
0 commit comments