@@ -1309,6 +1309,38 @@ public function testRetrieveJWTCertificateCachingSaveFailure()
1309
1309
$ tokens ->retrieveJWTCertificate ();
1310
1310
}
1311
1311
1312
+ /**
1313
+ * @covers Tokens::getSubjectIdFromToken
1314
+ */
1315
+ public function testGetSubjectIdFromTokenReturnsClientIdFromToken ()
1316
+ {
1317
+ $ mockClient = $ this ->getMockTokensClientWithFakeCertificate ();
1318
+
1319
+ $ fakeClientId = 'this-is-a-fake-client-id ' ;
1320
+ $ accessToken = $ this ->getFakeJWT ([
1321
+ 'sub ' => $ fakeClientId ,
1322
+ 'scopes ' => [$ fakeClientId ]
1323
+ ]);
1324
+
1325
+ $ clientIdFromToken = $ mockClient ->getSubjectIdFromToken ($ accessToken );
1326
+ $ this ->assertEquals ($ fakeClientId , $ clientIdFromToken );
1327
+ }
1328
+
1329
+ /**
1330
+ * @covers Tokens::getSubjectIdFromToken
1331
+ */
1332
+ public function testGetSubjectIdFromTokenThrowsExceptionIfTokenContainsNoSubClaim ()
1333
+ {
1334
+ $ mockClient = $ this ->getMockTokensClientWithFakeCertificate ();
1335
+
1336
+ $ accessToken = $ this ->getFakeJWT ([
1337
+ 'sub ' => null
1338
+ ]);
1339
+
1340
+ $ this ->setExpectedException (InvalidTokenException::class);
1341
+ $ mockClient ->getSubjectIdFromToken ($ accessToken );
1342
+ }
1343
+
1312
1344
/**
1313
1345
* Gets the client with mocked HTTP responses.
1314
1346
*
@@ -1323,4 +1355,54 @@ private function getMockHttpClient(array $responses = [])
1323
1355
1324
1356
return $ httpClient ;
1325
1357
}
1358
+
1359
+ /**
1360
+ * Create a mock `Tokens` client, with the cache backend and certificate defined in instance variables
1361
+ * for this class.
1362
+ * @return \Talis\Persona\Client\Tokens
1363
+ */
1364
+ private function getMockTokensClientWithFakeCertificate ()
1365
+ {
1366
+ /** @var \Talis\Persona\Client\Tokens|\PHPUnit_Framework_MockObject_MockObject $mockClient */
1367
+ $ mockClient = $ this ->getMock (
1368
+ \Talis \Persona \Client \Tokens::class,
1369
+ ['retrieveJWTCertificate ' ],
1370
+ [
1371
+ [
1372
+ 'userAgent ' => 'unittest ' ,
1373
+ 'persona_host ' => 'localhost ' ,
1374
+ 'cacheBackend ' => $ this ->cacheBackend ,
1375
+ ]
1376
+ ]
1377
+ );
1378
+
1379
+ $ mockClient ->expects ($ this ->once ())
1380
+ ->method ('retrieveJWTCertificate ' )
1381
+ ->willReturn ($ this ->publicKey );
1382
+
1383
+ return $ mockClient ;
1384
+ }
1385
+
1386
+ /**
1387
+ * Creates a fake JWT with realistic-looking claim data.
1388
+ *
1389
+ * @param array $claims An array of JWT claims.
1390
+ * @return string An encoded JWT encapsulating the specified claims
1391
+ */
1392
+ private function getFakeJWT (array $ claims = [])
1393
+ {
1394
+ $ now = time ();
1395
+ $ fakeSubjectClientId = "fake-sub-client-id- {$ now }" ;
1396
+ $ fakeAudienceClientId = "fake-aud-client-id- {$ now }" ;
1397
+ $ defaultClaims = [
1398
+ 'aud ' => $ fakeAudienceClientId ,
1399
+ 'exp ' => $ now + 100 ,
1400
+ 'iat ' => $ now ,
1401
+ 'jti ' => $ now ,
1402
+ 'scopes ' => [$ fakeSubjectClientId ],
1403
+ 'sub ' => $ fakeSubjectClientId
1404
+ ];
1405
+ $ claimsWithDefaults = array_merge ($ defaultClaims , $ claims );
1406
+ return JWT ::encode ($ claimsWithDefaults , $ this ->privateKey , 'RS256 ' );
1407
+ }
1326
1408
}
0 commit comments