@@ -374,29 +374,22 @@ Java::
374374----
375375@Component
376376public class TenantJwtIssuerValidator implements OAuth2TokenValidator<Jwt> {
377- private final TenantRepository tenants;
378- private final Map<String, JwtIssuerValidator> validators = new ConcurrentHashMap<>();
377+ private final TenantRepository tenants;
379378
380- public TenantJwtIssuerValidator(TenantRepository tenants) {
381- this.tenants = tenants;
382- }
383-
384- @Override
385- public OAuth2TokenValidatorResult validate(Jwt token) {
386- return this.validators.computeIfAbsent(toTenant(token), this::fromTenant)
387- .validate(token);
388- }
379+ private final OAuth2Error error = new OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN, "The iss claim is not valid",
380+ "https://tools.ietf.org/html/rfc6750#section-3.1");
389381
390- private String toTenant(Jwt jwt ) {
391- return jwt.getIssuer() ;
392- }
382+ public TenantJwtIssuerValidator(TenantRepository tenants ) {
383+ this.tenants = tenants ;
384+ }
393385
394- private JwtIssuerValidator fromTenant(String tenant) {
395- return Optional.ofNullable(this.tenants.findById(tenant))
396- .map(t -> t.getAttribute("issuer"))
397- .map(JwtIssuerValidator::new)
398- .orElseThrow(() -> new IllegalArgumentException("unknown tenant"));
399- }
386+ @Override
387+ public OAuth2TokenValidatorResult validate(Jwt token) {
388+ if(this.tenants.findById(token.getIssuer()) != null) {
389+ return OAuth2TokenValidatorResult.success();
390+ }
391+ return OAuth2TokenValidatorResult.failure(this.error);
392+ }
400393}
401394----
402395
@@ -405,32 +398,17 @@ Kotlin::
405398[source,kotlin,role="secondary"]
406399----
407400@Component
408- class TenantJwtIssuerValidator(tenants: TenantRepository) : OAuth2TokenValidator<Jwt> {
409- private val tenants: TenantRepository
410- private val validators: MutableMap<String, JwtIssuerValidator> = ConcurrentHashMap()
411- override fun validate(token: Jwt): OAuth2TokenValidatorResult {
412- return validators.computeIfAbsent(toTenant(token)) { tenant: String -> fromTenant(tenant) }
413- .validate(token)
414- }
415-
416- private fun toTenant(jwt: Jwt): String {
417- return jwt.issuer.toString()
418- }
419-
420- private fun fromTenant(tenant: String): JwtIssuerValidator {
421- return Optional.ofNullable(tenants.findById(tenant))
422- .map({ t -> t.getAttribute("issuer") })
423- .map({ JwtIssuerValidator() })
424- .orElseThrow({ IllegalArgumentException("unknown tenant") })
425- }
401+ class TenantJwtIssuerValidator(private val tenants: TenantRepository) : OAuth2TokenValidator<Jwt> {
402+ private val error: OAuth2Error = OAuth2Error(OAuth2ErrorCodes.INVALID_TOKEN, "The iss claim is not valid",
403+ "https://tools.ietf.org/html/rfc6750#section-3.1")
426404
427- init {
428- this.tenants = tenants
405+ override fun validate(token: Jwt): OAuth2TokenValidatorResult {
406+ return if (tenants.findById(token.issuer) != null)
407+ OAuth2TokenValidatorResult.success() else OAuth2TokenValidatorResult.failure(error)
429408 }
430409}
431410----
432411======
433-
434412Now that we have a tenant-aware processor and a tenant-aware validator, we can proceed with creating our xref:servlet/oauth2/resource-server/jwt.adoc#oauth2resourceserver-jwt-architecture-jwtdecoder[`JwtDecoder`]:
435413
436414[tabs]
0 commit comments