Skip to content

bug org.springframework.security.oauth2.server.resource.introspection.SpringOpaqueTokenIntrospector introspect method error #14802

Closed
@beijixing1745

Description

@beijixing1745

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。

Metadata

Metadata

Assignees

Labels

in: oauth2An issue in OAuth2 modules (oauth2-core, oauth2-client, oauth2-resource-server, oauth2-jose)type: bugA general bug

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions