1
1
package no .nav .security .token .support .spring .integrationtest ;
2
2
3
- import com .nimbusds .jwt .JWT ;
4
- import com .nimbusds .jwt .JWTClaimsSet ;
5
- import com .nimbusds .jwt .PlainJWT ;
6
- import com .nimbusds .jwt .SignedJWT ;
7
- import com .nimbusds .oauth2 .sdk .TokenRequest ;
8
- import io .restassured .module .mockmvc .RestAssuredMockMvc ;
9
- import no .nav .security .mock .oauth2 .MockOAuth2Server ;
10
- import no .nav .security .mock .oauth2 .token .OAuth2TokenCallback ;
11
- import no .nav .security .token .support .test .JwkGenerator ;
3
+ import static io .restassured .module .mockmvc .RestAssuredMockMvc .given ;
4
+ import static no .nav .security .token .support .spring .integrationtest .MetaProtectedRestController .METAPROTECTED ;
5
+ import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .PROTECTED ;
6
+ import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .PROTECTED_WITH_CLAIMS ;
7
+ import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .PROTECTED_WITH_CLAIMS2 ;
8
+ import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .PROTECTED_WITH_CLAIMS_ANY_CLAIMS ;
9
+ import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .UNPROTECTED ;
10
+ import static no .nav .security .token .support .test .JwtTokenGenerator .ACR ;
11
+ import static no .nav .security .token .support .test .JwtTokenGenerator .AUD ;
12
+ import static no .nav .security .token .support .test .JwtTokenGenerator .createSignedJWT ;
13
+
14
+ import java .util .Collection ;
15
+ import java .util .Date ;
16
+ import java .util .Map ;
17
+ import java .util .Optional ;
18
+ import java .util .UUID ;
19
+ import java .util .concurrent .TimeUnit ;
20
+
21
+ import javax .servlet .Filter ;
22
+
12
23
import org .jetbrains .annotations .NotNull ;
13
24
import org .junit .jupiter .api .BeforeEach ;
14
25
import org .junit .jupiter .api .Test ;
21
32
import org .springframework .test .web .servlet .setup .MockMvcConfigurer ;
22
33
import org .springframework .web .context .WebApplicationContext ;
23
34
24
- import javax .servlet .Filter ;
25
- import java .util .*;
26
- import java .util .concurrent .TimeUnit ;
35
+ import com .nimbusds .jwt .JWT ;
36
+ import com .nimbusds .jwt .JWTClaimsSet ;
37
+ import com .nimbusds .jwt .PlainJWT ;
38
+ import com .nimbusds .jwt .SignedJWT ;
39
+ import com .nimbusds .oauth2 .sdk .TokenRequest ;
27
40
28
- import static io .restassured .module .mockmvc .RestAssuredMockMvc .given ;
29
- import static no .nav .security .token .support .spring .integrationtest .ProtectedRestController .*;
30
- import static no .nav .security .token .support .test .JwtTokenGenerator .*;
41
+ import io .restassured .module .mockmvc .RestAssuredMockMvc ;
42
+ import no .nav .security .mock .oauth2 .MockOAuth2Server ;
43
+ import no .nav .security .mock .oauth2 .token .OAuth2TokenCallback ;
44
+ import no .nav .security .token .support .test .JwkGenerator ;
31
45
32
46
@ SpringBootTest
33
- @ ContextConfiguration (classes = {ProtectedApplication .class , ProtectedApplicationConfig .class })
47
+ @ ContextConfiguration (classes = { ProtectedApplication .class , ProtectedApplicationConfig .class })
34
48
@ ActiveProfiles ("test" )
35
49
class ProtectedRestControllerIntegrationTest {
36
50
@@ -56,21 +70,21 @@ public void afterConfigurerAdded(ConfigurableMockMvcBuilder<?> builder) {
56
70
@ Test
57
71
void unprotectedMethod () {
58
72
given ()
59
- .when ()
60
- .get (UNPROTECTED )
61
- .then ()
62
- .log ().ifValidationFails ()
63
- .statusCode (HttpStatus .OK .value ());
73
+ .when ()
74
+ .get (UNPROTECTED )
75
+ .then ()
76
+ .log ().ifValidationFails ()
77
+ .statusCode (HttpStatus .OK .value ());
64
78
}
65
79
66
80
@ Test
67
81
void noTokenInRequest () {
68
82
given ()
69
- .when ()
70
- .get (PROTECTED )
71
- .then ()
72
- .log ().ifValidationFails ()
73
- .statusCode (HttpStatus .UNAUTHORIZED .value ());
83
+ .when ()
84
+ .get (PROTECTED )
85
+ .then ()
86
+ .log ().ifValidationFails ()
87
+ .statusCode (HttpStatus .UNAUTHORIZED .value ());
74
88
75
89
}
76
90
@@ -100,8 +114,8 @@ void signedTokenInRequestUnknownAudience() {
100
114
@ Test
101
115
void signedTokenInRequestProtectedWithClaimsMethodMissingRequiredClaims () {
102
116
JWTClaimsSet jwtClaimsSet = defaultJwtClaimsSetBuilder ()
103
- .claim ("importantclaim" , "vip" )
104
- .build ();
117
+ .claim ("importantclaim" , "vip" )
118
+ .build ();
105
119
expectStatusCode (PROTECTED_WITH_CLAIMS , issueToken ("knownissuer" , jwtClaimsSet ).serialize (), HttpStatus .UNAUTHORIZED );
106
120
}
107
121
@@ -118,18 +132,24 @@ void signedTokenInRequestProtectedMethodShouldBeOk() {
118
132
expectStatusCode (PROTECTED , jwt .serialize (), HttpStatus .OK );
119
133
}
120
134
135
+ @ Test
136
+ void signedTokenInRequestProtectedMetaMethodShouldBeOk () {
137
+ JWT jwt = issueToken ("knownissuer" , jwtClaimsSetKnownIssuer ());
138
+ expectStatusCode (METAPROTECTED , jwt .serialize (), HttpStatus .OK );
139
+ }
140
+
121
141
@ Test
122
142
void signedTokenInRequestProtectedWithClaimsMethodShouldBeOk () {
123
143
JWTClaimsSet jwtClaimsSet = defaultJwtClaimsSetBuilder ()
124
- .claim ("importantclaim" , "vip" )
125
- .claim ("acr" , "Level4" )
126
- .build ();
144
+ .claim ("importantclaim" , "vip" )
145
+ .claim ("acr" , "Level4" )
146
+ .build ();
127
147
128
148
expectStatusCode (PROTECTED_WITH_CLAIMS , issueToken ("knownissuer" , jwtClaimsSet ).serialize (), HttpStatus .OK );
129
149
130
150
JWTClaimsSet jwtClaimsSet2 = defaultJwtClaimsSetBuilder ()
131
- .claim ("claim1" , "1" )
132
- .build ();
151
+ .claim ("claim1" , "1" )
152
+ .build ();
133
153
134
154
expectStatusCode (PROTECTED_WITH_CLAIMS_ANY_CLAIMS , issueToken ("knownissuer" , jwtClaimsSet2 ).serialize (), HttpStatus .OK );
135
155
}
@@ -138,12 +158,12 @@ void signedTokenInRequestProtectedWithClaimsMethodShouldBeOk() {
138
158
void signedTokenInRequestWithoutSubAndAudClaimsShouldBeOk () {
139
159
Date now = new Date ();
140
160
JWTClaimsSet jwtClaimsSet = new JWTClaimsSet .Builder ()
141
- .jwtID (UUID .randomUUID ().toString ())
142
- .claim ("auth_time" , now )
143
- .notBeforeTime (now )
144
- .issueTime (now )
145
- .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )))
146
- .build ();
161
+ .jwtID (UUID .randomUUID ().toString ())
162
+ .claim ("auth_time" , now )
163
+ .notBeforeTime (now )
164
+ .issueTime (now )
165
+ .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )))
166
+ .build ();
147
167
148
168
expectStatusCode (PROTECTED_WITH_CLAIMS2 , issueToken ("knownissuer2" , jwtClaimsSet ).serialize (), HttpStatus .OK );
149
169
}
@@ -152,36 +172,36 @@ void signedTokenInRequestWithoutSubAndAudClaimsShouldBeOk() {
152
172
void signedTokenInRequestWithoutSubAndAudClaimsShouldBeNotBeOk () {
153
173
Date now = new Date ();
154
174
JWTClaimsSet jwtClaimsSet = new JWTClaimsSet .Builder ()
155
- .jwtID (UUID .randomUUID ().toString ())
156
- .claim ("auth_time" , now )
157
- .notBeforeTime (now )
158
- .issueTime (now )
159
- .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )))
160
- .build ();
175
+ .jwtID (UUID .randomUUID ().toString ())
176
+ .claim ("auth_time" , now )
177
+ .notBeforeTime (now )
178
+ .issueTime (now )
179
+ .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )))
180
+ .build ();
161
181
162
182
expectStatusCode (PROTECTED_WITH_CLAIMS , issueToken ("knownissuer" , jwtClaimsSet ).serialize (), HttpStatus .UNAUTHORIZED );
163
183
}
164
184
165
185
private static void expectStatusCode (String uri , String token , HttpStatus httpStatus ) {
166
186
given ()
167
- .header ("Authorization" , "Bearer " + token )
168
- .when ()
169
- .get (uri )
170
- .then ()
171
- .log ().ifValidationFails ()
172
- .statusCode (httpStatus .value ());
187
+ .header ("Authorization" , "Bearer " + token )
188
+ .when ()
189
+ .get (uri )
190
+ .then ()
191
+ .log ().ifValidationFails ()
192
+ .statusCode (httpStatus .value ());
173
193
}
174
194
175
195
private static JWTClaimsSet .Builder defaultJwtClaimsSetBuilder () {
176
196
Date now = new Date ();
177
197
return new JWTClaimsSet .Builder ()
178
- .subject ("testsub" )
179
- .audience (AUD )
180
- .jwtID (UUID .randomUUID ().toString ())
181
- .claim ("auth_time" , now )
182
- .notBeforeTime (now )
183
- .issueTime (now )
184
- .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )));
198
+ .subject ("testsub" )
199
+ .audience (AUD )
200
+ .jwtID (UUID .randomUUID ().toString ())
201
+ .claim ("auth_time" , now )
202
+ .notBeforeTime (now )
203
+ .issueTime (now )
204
+ .expirationTime (new Date (now .getTime () + TimeUnit .MINUTES .toMillis (1 )));
185
205
}
186
206
187
207
private static JWTClaimsSet jwtClaimsSetKnownIssuer () {
@@ -193,19 +213,19 @@ private static JWTClaimsSet jwtClaimsSet(String audience) {
193
213
}
194
214
195
215
public static JWTClaimsSet buildClaimSet (String subject , String audience , String authLevel ,
196
- long expiry ) {
216
+ long expiry ) {
197
217
Date now = new Date ();
198
218
return new JWTClaimsSet .Builder ()
199
- .subject (subject )
200
- .audience (audience )
201
- .jwtID (UUID .randomUUID ().toString ())
202
- .claim ("acr" , authLevel )
203
- .claim ("ver" , "1.0" )
204
- .claim ("nonce" , "myNonce" )
205
- .claim ("auth_time" , now )
206
- .notBeforeTime (now )
207
- .issueTime (now )
208
- .expirationTime (new Date (now .getTime () + expiry )).build ();
219
+ .subject (subject )
220
+ .audience (audience )
221
+ .jwtID (UUID .randomUUID ().toString ())
222
+ .claim ("acr" , authLevel )
223
+ .claim ("ver" , "1.0" )
224
+ .claim ("nonce" , "myNonce" )
225
+ .claim ("auth_time" , now )
226
+ .notBeforeTime (now )
227
+ .issueTime (now )
228
+ .expirationTime (new Date (now .getTime () + expiry )).build ();
209
229
}
210
230
211
231
private SignedJWT issueToken (String issuerId , JWTClaimsSet jwtClaimsSet ) {
@@ -229,10 +249,10 @@ public String issuerId() {
229
249
@ Override
230
250
public String audience (@ NotNull TokenRequest tokenRequest ) {
231
251
return Optional .ofNullable (jwtClaimsSet .getAudience ())
232
- .stream ()
233
- .flatMap (a -> a .stream ())
234
- .findFirst ()
235
- .orElse (null );
252
+ .stream ()
253
+ .flatMap (a -> a .stream ())
254
+ .findFirst ()
255
+ .orElse (null );
236
256
}
237
257
238
258
@ NotNull
0 commit comments