mirror of
https://github.com/spring-projects/spring-security.git
synced 2025-07-02 00:32:15 +00:00
Polish to Avoid NPE
Issue gh-5648 Co-authored-by: MattyA <mat.auburn@gmail.com>
This commit is contained in:
parent
48a0514965
commit
acfe4bdcfb
@ -21,6 +21,7 @@ import java.net.URL;
|
||||
import java.text.ParseException;
|
||||
import java.time.Instant;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
@ -47,10 +48,12 @@ import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.RequestEntity;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
|
||||
import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult;
|
||||
import org.springframework.security.oauth2.jose.jws.JwsAlgorithms;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.client.RestOperations;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@ -190,9 +193,17 @@ public final class NimbusJwtDecoderJwkSupport implements JwtDecoder {
|
||||
private Jwt validateJwt(Jwt jwt){
|
||||
OAuth2TokenValidatorResult result = this.jwtValidator.validate(jwt);
|
||||
if (result.hasErrors()) {
|
||||
String description = result.getErrors().iterator().next().getDescription();
|
||||
Collection<OAuth2Error> errors = result.getErrors();
|
||||
String validationErrorString = "Unable to validate Jwt";
|
||||
for (OAuth2Error oAuth2Error : errors) {
|
||||
if (!StringUtils.isEmpty(oAuth2Error.getDescription())) {
|
||||
validationErrorString = String.format(
|
||||
DECODING_ERROR_MESSAGE_TEMPLATE, oAuth2Error.getDescription());
|
||||
break;
|
||||
}
|
||||
}
|
||||
throw new JwtValidationException(
|
||||
String.format(DECODING_ERROR_MESSAGE_TEMPLATE, description),
|
||||
validationErrorString,
|
||||
result.getErrors());
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ package org.springframework.security.oauth2.jwt;
|
||||
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.time.Instant;
|
||||
import java.util.Collection;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -40,10 +41,12 @@ import com.nimbusds.jwt.proc.DefaultJWTProcessor;
|
||||
import com.nimbusds.jwt.proc.JWTProcessor;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
|
||||
import org.springframework.security.oauth2.core.OAuth2TokenValidatorResult;
|
||||
import org.springframework.security.oauth2.jose.jws.JwsAlgorithms;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* An implementation of a {@link ReactiveJwtDecoder} that "decodes" a
|
||||
@ -184,9 +187,16 @@ public final class NimbusReactiveJwtDecoder implements ReactiveJwtDecoder {
|
||||
private Jwt validateJwt(Jwt jwt) {
|
||||
OAuth2TokenValidatorResult result = this.jwtValidator.validate(jwt);
|
||||
|
||||
if ( result.hasErrors() ) {
|
||||
String message = result.getErrors().iterator().next().getDescription();
|
||||
throw new JwtValidationException(message, result.getErrors());
|
||||
if (result.hasErrors()) {
|
||||
Collection<OAuth2Error> errors = result.getErrors();
|
||||
String validationErrorString = "Unable to validate Jwt";
|
||||
for (OAuth2Error oAuth2Error : errors) {
|
||||
if (!StringUtils.isEmpty(oAuth2Error.getDescription())) {
|
||||
validationErrorString = oAuth2Error.getDescription();
|
||||
break;
|
||||
}
|
||||
}
|
||||
throw new JwtValidationException(validationErrorString, errors);
|
||||
}
|
||||
|
||||
return jwt;
|
||||
|
@ -33,6 +33,7 @@ import org.assertj.core.api.Assertions;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
import org.powermock.core.classloader.annotations.PowerMockIgnore;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
@ -241,6 +242,22 @@ public class NimbusJwtDecoderJwkSupportTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void decodeWhenReadingErrorPickTheFirstErrorMessage() {
|
||||
OAuth2TokenValidator<Jwt> jwtValidator = mock(OAuth2TokenValidator.class);
|
||||
this.jwtDecoder.setJwtValidator(jwtValidator);
|
||||
|
||||
OAuth2Error errorEmpty = new OAuth2Error("mock-error", "", "mock-uri");
|
||||
OAuth2Error error = new OAuth2Error("mock-error", "mock-description", "mock-uri");
|
||||
OAuth2Error error2 = new OAuth2Error("mock-error-second", "mock-description-second", "mock-uri-second");
|
||||
OAuth2TokenValidatorResult result = OAuth2TokenValidatorResult.failure(errorEmpty, error, error2);
|
||||
Mockito.when(jwtValidator.validate(any(Jwt.class))).thenReturn(result);
|
||||
|
||||
Assertions.assertThatCode(() -> this.jwtDecoder.decode(SIGNED_JWT))
|
||||
.isInstanceOf(JwtValidationException.class)
|
||||
.hasMessageContaining("mock-description");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void decodeWhenUsingSignedJwtThenReturnsClaimsGivenByClaimSetConverter() throws Exception {
|
||||
try ( MockWebServer server = new MockWebServer() ) {
|
||||
|
@ -177,6 +177,23 @@ public class NimbusReactiveJwtDecoderTests {
|
||||
.hasMessageContaining("mock-description");
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void decodeWhenReadingErrorPickTheFirstErrorMessage() {
|
||||
OAuth2TokenValidator<Jwt> jwtValidator = mock(OAuth2TokenValidator.class);
|
||||
this.decoder.setJwtValidator(jwtValidator);
|
||||
|
||||
OAuth2Error errorEmpty = new OAuth2Error("mock-error", "", "mock-uri");
|
||||
OAuth2Error error = new OAuth2Error("mock-error", "mock-description", "mock-uri");
|
||||
OAuth2Error error2 = new OAuth2Error("mock-error-second", "mock-description-second", "mock-uri-second");
|
||||
OAuth2TokenValidatorResult result = OAuth2TokenValidatorResult.failure(errorEmpty, error, error2);
|
||||
when(jwtValidator.validate(any(Jwt.class))).thenReturn(result);
|
||||
|
||||
assertThatCode(() -> this.decoder.decode(this.messageReadToken).block())
|
||||
.isInstanceOf(JwtValidationException.class)
|
||||
.hasMessageContaining("mock-description");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void setJwtValidatorWhenGivenNullThrowsIllegalArgumentException() {
|
||||
assertThatCode(() -> this.decoder.setJwtValidator(null))
|
||||
|
Loading…
x
Reference in New Issue
Block a user