getClient(); $verify = new Google_AccessToken_Verify($client->getHttpClient()); // set these to values that will be changed if (defined('MATH_BIGINTEGER_OPENSSL_ENABLED') || defined('CRYPT_RSA_MODE')) { $this->markTestSkipped('Cannot run test - constants already defined'); } // Pretend we are on App Engine VMs putenv('GAE_VM=1'); $verify->verifyIdToken('a.b.c'); putenv('GAE_VM=0'); $openSslEnable = constant('MATH_BIGINTEGER_OPENSSL_ENABLED'); $rsaMode = constant('CRYPT_RSA_MODE'); $this->assertEquals(true, $openSslEnable); $this->assertEquals(phpseclib\Crypt\RSA::MODE_OPENSSL, $rsaMode); } /** * Most of the logic for ID token validation is in AuthTest - * this is just a general check to ensure we verify a valid * id token if one exists. */ public function testValidateIdToken() { $this->checkToken(); $jwt = $this->getJwtService(); $client = $this->getClient(); $http = $client->getHttpClient(); $token = $client->getAccessToken(); if ($client->isAccessTokenExpired()) { $token = $client->fetchAccessTokenWithRefreshToken(); } $segments = explode('.', $token['id_token']); $this->assertEquals(3, count($segments)); // Extract the client ID in this case as it wont be set on the test client. $data = json_decode($jwt->urlSafeB64Decode($segments[1])); $verify = new Google_AccessToken_Verify($http); $payload = $verify->verifyIdToken($token['id_token'], $data->aud); $this->assertTrue(isset($payload['sub'])); $this->assertTrue(strlen($payload['sub']) > 0); // TODO: Need to be smart about testing/disabling the // caching for this test to make sense. Not sure how to do that // at the moment. $client = $this->getClient(); $http = $client->getHttpClient(); $data = json_decode($jwt->urlSafeB64Decode($segments[1])); $verify = new Google_AccessToken_Verify($http); $payload = $verify->verifyIdToken($token['id_token'], $data->aud); $this->assertTrue(isset($payload['sub'])); $this->assertTrue(strlen($payload['sub']) > 0); } public function testRetrieveCertsFromLocation() { $client = $this->getClient(); $verify = new Google_AccessToken_Verify($client->getHttpClient()); // make this method public for testing purposes $method = new ReflectionMethod($verify, 'retrieveCertsFromLocation'); $method->setAccessible(true); $certs = $method->invoke($verify, Google_AccessToken_Verify::FEDERATED_SIGNON_CERT_URL); $this->assertArrayHasKey('keys', $certs); $this->assertGreaterThan(1, count($certs['keys'])); $this->assertArrayHasKey('alg', $certs['keys'][0]); $this->assertEquals('RS256', $certs['keys'][0]['alg']); } private function getJwtService() { if (class_exists('\Firebase\JWT\JWT')) { return new \Firebase\JWT\JWT; } return new \JWT; } }