@@ -374,29 +374,22 @@ Java::
374
374
----
375
375
@Component
376
376
public class TenantJwtIssuerValidator implements OAuth2TokenValidator<Jwt> {
377
- private final TenantRepository tenants;
378
- private final Map<String, JwtIssuerValidator> validators = new ConcurrentHashMap<>();
377
+ private final TenantRepository tenants;
379
378
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");
389
381
390
- private String toTenant(Jwt jwt ) {
391
- return jwt.getIssuer() ;
392
- }
382
+ public TenantJwtIssuerValidator(TenantRepository tenants ) {
383
+ this.tenants = tenants ;
384
+ }
393
385
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
+ }
400
393
}
401
394
----
402
395
@@ -405,32 +398,17 @@ Kotlin::
405
398
[source,kotlin,role="secondary"]
406
399
----
407
400
@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")
426
404
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)
429
408
}
430
409
}
431
410
----
432
411
======
433
-
434
412
Now 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`]:
435
413
436
414
[tabs]
0 commit comments