Skip to content

Commit a1ebe86

Browse files
committed
Fix for cases where oidc custom role claims fail to parse
1 parent 7765d46 commit a1ebe86

1 file changed

Lines changed: 25 additions & 8 deletions

File tree

src/main/java/eu/openanalytics/containerproxy/auth/impl/OpenIDAuthenticationBackend.java

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
package eu.openanalytics.containerproxy.auth.impl;
2222

23+
import java.util.ArrayList;
2324
import java.util.Collections;
2425
import java.util.HashSet;
2526
import java.util.List;
@@ -58,6 +59,8 @@
5859
import eu.openanalytics.containerproxy.auth.IAuthenticationBackend;
5960
import eu.openanalytics.containerproxy.util.SessionHelper;
6061
import net.minidev.json.JSONArray;
62+
import net.minidev.json.parser.JSONParser;
63+
import net.minidev.json.parser.ParseException;
6164

6265
public class OpenIDAuthenticationBackend implements IAuthenticationBackend {
6366

@@ -175,18 +178,32 @@ protected GrantedAuthoritiesMapper createAuthoritiesMapper() {
175178
.collect(Collectors.joining(lineSep));
176179
log.debug(String.format("Checking for roles in claim '%s'. Available claims in ID token (%d):%s%s",
177180
rolesClaimName, idToken.getClaims().size(), lineSep, claims));
178-
179-
Object claimValue = idToken.getClaims().get(rolesClaimName);
180-
if (claimValue != null) {
181-
log.debug(String.format("Matching claim found: %s -> %s (%s)", rolesClaimName, claimValue, claimValue.getClass()));
182-
} else {
183-
log.debug("No matching claim found.");
184-
}
181+
}
182+
183+
Object claimValue = idToken.getClaims().get(rolesClaimName);
184+
if (claimValue == null) {
185+
log.debug("No matching claim found.");
186+
} else {
187+
log.debug(String.format("Matching claim found: %s -> %s (%s)", rolesClaimName, claimValue, claimValue.getClass()));
185188
}
186189

190+
// Workaround: in some cases, getClaimAsStringList fails to parse??
187191
List<String> roles = idToken.getClaimAsStringList(rolesClaimName);
192+
if (roles == null && claimValue instanceof String) {
193+
List<String> parsedRoles = new ArrayList<>();
194+
try {
195+
Object value = new JSONParser(JSONParser.MODE_PERMISSIVE).parse((String) claimValue);
196+
if (value instanceof List) {
197+
List<?> valueList = (List<?>) value;
198+
valueList.forEach(o -> parsedRoles.add(o.toString()));
199+
}
200+
} catch (ParseException e) {
201+
// Unable to parse JSON
202+
}
203+
roles = parsedRoles;
204+
}
188205
if (roles == null) {
189-
if (log.isDebugEnabled()) log.debug("Failed to parse claim value as an array: " + idToken.getClaims().get(rolesClaimName));
206+
if (log.isDebugEnabled()) log.debug("Failed to parse claim value as an array: " + claimValue);
190207
continue;
191208
}
192209

0 commit comments

Comments
 (0)