33
33
import java .io .InputStream ;
34
34
import java .io .InputStreamReader ;
35
35
import java .io .Reader ;
36
+ import java .util .ArrayDeque ;
36
37
import java .util .Arrays ;
37
38
import java .util .Collections ;
38
39
import java .util .HashMap ;
39
40
import java .util .List ;
40
41
import java .util .Map ;
42
+ import java .util .Queue ;
41
43
import junit .framework .TestCase ;
44
+ import org .junit .Assert ;
42
45
43
46
/**
44
47
* Tests {@link IdTokenVerifier}.
@@ -101,7 +104,7 @@ public void testBuilder() throws Exception {
101
104
assertEquals (TRUSTED_CLIENT_IDS , Lists .newArrayList (verifier .getAudience ()));
102
105
}
103
106
104
- public void testVerify () throws Exception {
107
+ public void testVerifyPayload () throws Exception {
105
108
MockClock clock = new MockClock ();
106
109
MockEnvironment testEnvironment = new MockEnvironment ();
107
110
testEnvironment .setVariable (IdTokenVerifier .SKIP_SIGNATURE_ENV_VAR , "true" );
@@ -121,21 +124,31 @@ public void testVerify() throws Exception {
121
124
clock .timeMillis = 1500000L ;
122
125
IdToken idToken = newIdToken (ISSUER , CLIENT_ID );
123
126
assertTrue (verifier .verify (idToken ));
127
+ assertTrue (verifier .verifyPayload (idToken ));
124
128
assertTrue (verifierFlexible .verify (newIdToken (ISSUER2 , CLIENT_ID )));
129
+ assertTrue (verifierFlexible .verifyPayload (newIdToken (ISSUER2 , CLIENT_ID )));
125
130
assertFalse (verifier .verify (newIdToken (ISSUER2 , CLIENT_ID )));
131
+ assertFalse (verifier .verifyPayload (newIdToken (ISSUER2 , CLIENT_ID )));
126
132
assertTrue (verifier .verify (newIdToken (ISSUER3 , CLIENT_ID )));
133
+ assertTrue (verifier .verifyPayload (newIdToken (ISSUER3 , CLIENT_ID )));
127
134
// audience
128
135
assertTrue (verifierFlexible .verify (newIdToken (ISSUER , CLIENT_ID2 )));
136
+ assertTrue (verifierFlexible .verifyPayload (newIdToken (ISSUER , CLIENT_ID2 )));
129
137
assertFalse (verifier .verify (newIdToken (ISSUER , CLIENT_ID2 )));
138
+ assertFalse (verifier .verifyPayload (newIdToken (ISSUER , CLIENT_ID2 )));
130
139
// time
131
140
clock .timeMillis = 700000L ;
132
141
assertTrue (verifier .verify (idToken ));
142
+ assertTrue (verifier .verifyPayload (idToken ));
133
143
clock .timeMillis = 2300000L ;
134
144
assertTrue (verifier .verify (idToken ));
145
+ assertTrue (verifier .verifyPayload (idToken ));
135
146
clock .timeMillis = 699999L ;
136
147
assertFalse (verifier .verify (idToken ));
148
+ assertFalse (verifier .verifyPayload (idToken ));
137
149
clock .timeMillis = 2300001L ;
138
150
assertFalse (verifier .verify (idToken ));
151
+ assertFalse (verifier .verifyPayload (idToken ));
139
152
}
140
153
141
154
public void testEmptyIssuersFails () throws Exception {
@@ -187,28 +200,52 @@ public void testMissingAudience() throws VerificationException {
187
200
188
201
public void testVerifyEs256TokenPublicKeyMismatch () throws Exception {
189
202
// Mock HTTP requests
190
- HttpTransportFactory httpTransportFactory =
191
- new HttpTransportFactory () {
203
+ MockLowLevelHttpRequest failedRequest =
204
+ new MockLowLevelHttpRequest () {
192
205
@ Override
193
- public HttpTransport create () {
194
- return new MockHttpTransport () {
195
- @ Override
196
- public LowLevelHttpRequest buildRequest (String method , String url )
197
- throws IOException {
198
- return new MockLowLevelHttpRequest () {
199
- @ Override
200
- public LowLevelHttpResponse execute () throws IOException {
201
- MockLowLevelHttpResponse response = new MockLowLevelHttpResponse ();
202
- response .setStatusCode (200 );
203
- response .setContentType ("application/json" );
204
- response .setContent ("" );
205
- return response ;
206
- }
207
- };
208
- }
209
- };
206
+ public LowLevelHttpResponse execute () throws IOException {
207
+ throw new IOException ("test io exception" );
208
+ }
209
+ };
210
+
211
+ MockLowLevelHttpRequest badRequest =
212
+ new MockLowLevelHttpRequest () {
213
+ @ Override
214
+ public LowLevelHttpResponse execute () throws IOException {
215
+ MockLowLevelHttpResponse response = new MockLowLevelHttpResponse ();
216
+ response .setStatusCode (404 );
217
+ response .setContentType ("application/json" );
218
+ response .setContent ("" );
219
+ return response ;
220
+ }
221
+ };
222
+
223
+ MockLowLevelHttpRequest emptyRequest =
224
+ new MockLowLevelHttpRequest () {
225
+ @ Override
226
+ public LowLevelHttpResponse execute () throws IOException {
227
+ MockLowLevelHttpResponse response = new MockLowLevelHttpResponse ();
228
+ response .setStatusCode (200 );
229
+ response .setContentType ("application/json" );
230
+ response .setContent ("{\" keys\" :[]}" );
231
+ return response ;
232
+ }
233
+ };
234
+
235
+ MockLowLevelHttpRequest goodRequest =
236
+ new MockLowLevelHttpRequest () {
237
+ @ Override
238
+ public LowLevelHttpResponse execute () throws IOException {
239
+ MockLowLevelHttpResponse response = new MockLowLevelHttpResponse ();
240
+ response .setStatusCode (200 );
241
+ response .setContentType ("application/json" );
242
+ response .setContent (readResourceAsString ("iap_keys.json" ));
243
+ return response ;
210
244
}
211
245
};
246
+
247
+ HttpTransportFactory httpTransportFactory =
248
+ mockTransport (failedRequest , badRequest , emptyRequest , goodRequest );
212
249
IdTokenVerifier tokenVerifier =
213
250
new IdTokenVerifier .Builder ()
214
251
.setClock (FIXED_CLOCK )
@@ -219,8 +256,24 @@ public LowLevelHttpResponse execute() throws IOException {
219
256
tokenVerifier .verifySignature (IdToken .parse (JSON_FACTORY , ES256_TOKEN ));
220
257
fail ("Should have failed verification" );
221
258
} catch (VerificationException ex ) {
222
- assertTrue (ex .getMessage ().contains ("Error fetching PublicKey" ));
259
+ assertTrue (ex .getMessage ().contains ("Error fetching public key" ));
260
+ }
261
+
262
+ try {
263
+ tokenVerifier .verifySignature (IdToken .parse (JSON_FACTORY , ES256_TOKEN ));
264
+ fail ("Should have failed verification" );
265
+ } catch (VerificationException ex ) {
266
+ assertTrue (ex .getMessage ().contains ("Error fetching public key" ));
223
267
}
268
+
269
+ try {
270
+ tokenVerifier .verifySignature (IdToken .parse (JSON_FACTORY , ES256_TOKEN ));
271
+ fail ("Should have failed verification" );
272
+ } catch (VerificationException ex ) {
273
+ assertTrue (ex .getCause ().getMessage ().contains ("No valid public key returned" ));
274
+ }
275
+
276
+ Assert .assertTrue (tokenVerifier .verifySignature (IdToken .parse (JSON_FACTORY , ES256_TOKEN )));
224
277
}
225
278
226
279
public void testVerifyEs256Token () throws VerificationException , IOException {
@@ -284,6 +337,25 @@ static String readResourceAsString(String resourceName) throws IOException {
284
337
}
285
338
}
286
339
340
+ static HttpTransportFactory mockTransport (LowLevelHttpRequest ... requests ) {
341
+ final LowLevelHttpRequest firstRequest = requests [0 ];
342
+ final Queue <LowLevelHttpRequest > requestQueue = new ArrayDeque <>();
343
+ for (LowLevelHttpRequest request : requests ) {
344
+ requestQueue .add (request );
345
+ }
346
+ return new HttpTransportFactory () {
347
+ @ Override
348
+ public HttpTransport create () {
349
+ return new MockHttpTransport () {
350
+ @ Override
351
+ public LowLevelHttpRequest buildRequest (String method , String url ) throws IOException {
352
+ return requestQueue .poll ();
353
+ }
354
+ };
355
+ }
356
+ };
357
+ }
358
+
287
359
static HttpTransportFactory mockTransport (String url , String certificates ) {
288
360
final String certificatesContent = certificates ;
289
361
final String certificatesUrl = url ;
0 commit comments