Closed
Description
Describe the bug
java.lang.UnsupportedOperationException: null
at java.base/java.util.Collections$EmptyMap.computeIfPresent(Collections.java:4770)
To Reproduce
in method introspect if claims is null,invoke method convertClaimsSet will throw UnsupportedOperationException。
public OAuth2AuthenticatedPrincipal introspect(String token) {
RequestEntity<?> requestEntity = (RequestEntity)this.requestEntityConverter.convert(token);
if (requestEntity == null) {
throw new OAuth2IntrospectionException("requestEntityConverter returned a null entity");
} else {
ResponseEntity<Map<String, Object>> responseEntity = this.makeRequest(requestEntity);
Map<String, Object> claims = this.adaptToNimbusResponse(responseEntity);
return this.convertClaimsSet(claims);
}
}
private Map<String, Object> adaptToNimbusResponse(ResponseEntity<Map<String, Object>> responseEntity) {
if (responseEntity.getStatusCode() != HttpStatus.OK) {
throw new OAuth2IntrospectionException("Introspection endpoint responded with " + responseEntity.getStatusCode());
} else {
Map<String, Object> claims = (Map)responseEntity.getBody();
if (claims == null) {
return Collections.emptyMap();
} else {
boolean active = (Boolean)claims.compute("active", (k, v) -> {
if (v instanceof String) {
return Boolean.parseBoolean((String)v);
} else {
return v instanceof Boolean ? v : false;
}
});
if (!active) {
this.logger.trace("Did not validate token since it is inactive");
throw new BadOpaqueTokenException("Provided token isn't active");
} else {
return claims;
}
}
}
}
private OAuth2AuthenticatedPrincipal convertClaimsSet(Map<String, Object> claims) {
claims.computeIfPresent("aud", (k, v) -> {
return v instanceof String ? Collections.singletonList(v) : v;
});
claims.computeIfPresent("client_id", (k, v) -> {
return v.toString();
});
claims.computeIfPresent("exp", (k, v) -> {
return Instant.ofEpochSecond(((Number)v).longValue());
});
claims.computeIfPresent("iat", (k, v) -> {
return Instant.ofEpochSecond(((Number)v).longValue());
});
claims.computeIfPresent("iss", (k, v) -> {
return v.toString();
});
claims.computeIfPresent("nbf", (k, v) -> {
return Instant.ofEpochSecond(((Number)v).longValue());
});
Collection<GrantedAuthority> authorities = new ArrayList();
claims.computeIfPresent("scope", (k, v) -> {
if (!(v instanceof String)) {
return v;
} else {
Collection<String> scopes = Arrays.asList(((String)v).split(" "));
Iterator var4 = scopes.iterator();
while(var4.hasNext()) {
String scope = (String)var4.next();
authorities.add(new SimpleGrantedAuthority("SCOPE_" + scope));
}
return scopes;
}
});
return new OAuth2IntrospectionAuthenticatedPrincipal(claims, authorities);
}
Expected behavior
1.in method adaptToNimbusResponse return new HashMap()。
so next method use claims will not throw UnsupportedOperationException。