1 package com.atlassian.asap.core.validator;
2
3 import com.atlassian.asap.api.Jwt;
4 import com.atlassian.asap.api.exception.CannotRetrieveKeyException;
5 import com.atlassian.asap.api.exception.InvalidTokenException;
6 import com.atlassian.asap.core.keys.KeyProvider;
7 import com.atlassian.asap.core.parser.JwtParser;
8 import com.atlassian.asap.core.parser.VerifiableJwt;
9 import com.atlassian.asap.core.server.AuthenticationContext;
10 import com.atlassian.asap.nimbus.parser.NimbusJwtParser;
11
12 import java.security.PublicKey;
13 import java.time.Clock;
14 import java.util.Collections;
15 import java.util.Objects;
16 import java.util.Optional;
17 import java.util.Set;
18 import java.util.function.Supplier;
19
20
21
22
23
24
25 public class JwtValidatorImpl implements JwtValidator {
26 private final KeyProvider<PublicKey> publicKeyProvider;
27 private final JwtParser jwtParser;
28 private final JwtClaimsValidator jwtClaimsValidator;
29 private final Supplier<Set<String>> resourceServerAudiences;
30
31
32
33
34
35
36
37
38
39
40 public JwtValidatorImpl(KeyProvider<PublicKey> publicKeyProvider,
41 JwtParser jwtParser,
42 JwtClaimsValidator claimValidator,
43 Supplier<Set<String>> resourceServerAudiences) {
44 this.publicKeyProvider = Objects.requireNonNull(publicKeyProvider);
45 this.jwtParser = Objects.requireNonNull(jwtParser);
46 this.jwtClaimsValidator = Objects.requireNonNull(claimValidator);
47 this.resourceServerAudiences = Objects.requireNonNull(resourceServerAudiences);
48 }
49
50
51
52
53
54
55
56
57
58
59 public JwtValidatorImpl(KeyProvider<PublicKey> publicKeyProvider,
60 JwtParser jwtParser,
61 JwtClaimsValidator claimValidator,
62 Set<String> resourceServerAudiences) {
63 this(publicKeyProvider, jwtParser, claimValidator, () -> resourceServerAudiences);
64 }
65
66
67
68
69
70
71
72
73
74 public JwtValidatorImpl(KeyProvider<PublicKey> publicKeyProvider,
75 JwtParser jwtParser,
76 JwtClaimsValidator claimValidator,
77 String resourceServerAudience) {
78 this(publicKeyProvider, jwtParser, claimValidator, Collections.singleton(resourceServerAudience));
79 }
80
81 @Override
82 public final Jwt readAndValidate(String serializedJwt)
83 throws InvalidTokenException, CannotRetrieveKeyException {
84
85 VerifiableJwt verifiableJwt = jwtParser.parse(serializedJwt);
86
87
88 ValidatedKeyId validatedKeyId = ValidatedKeyId.validate(verifiableJwt.getHeader().getKeyId());
89
90
91 PublicKey publicKey = publicKeyProvider.getKey(validatedKeyId);
92 verifiableJwt.verifySignature(publicKey);
93
94
95 jwtClaimsValidator.validate(verifiableJwt, resourceServerAudiences.get());
96
97 return verifiableJwt;
98 }
99
100 @Override
101 public final Optional<String> determineUnverifiedIssuer(String serializedJwt) {
102 return jwtParser.determineUnverifiedIssuer(serializedJwt);
103 }
104
105
106
107
108
109
110
111 public static JwtValidator createDefault(AuthenticationContext authenticationContext) {
112 return new JwtValidatorImpl(authenticationContext.getPublicKeyProvider(),
113 new NimbusJwtParser(),
114 new JwtClaimsValidator(Clock.systemUTC()),
115 authenticationContext.getResourceServerAudiences());
116 }
117
118
119
120
121
122
123
124
125 public static JwtValidator createDefault(String audience, String publicKeyRepoBaseUrl) {
126 AuthenticationContext authContext = new AuthenticationContext(audience, publicKeyRepoBaseUrl);
127 return createDefault(authContext);
128 }
129
130
131
132
133
134
135
136
137 public static JwtValidator createDefault(Set<String> audiences, String publicKeyRepoBaseUrl) {
138 AuthenticationContext authContext = new AuthenticationContext(audiences, publicKeyRepoBaseUrl);
139 return createDefault(authContext);
140 }
141 }