diff --git a/classes/JWKSHandler.php b/classes/JWKSHandler.php index 2f2d5bc96748730a8a1e592114c5827e1810992b..feffd906d1ac26d6c27e3ae528ffcf8461773efb 100644 --- a/classes/JWKSHandler.php +++ b/classes/JWKSHandler.php @@ -77,65 +77,4 @@ class JWKSHandler { return $matches[1]; } - public function loadAllJWKS(): array { - - foreach ($this->locator->getBrowserBasedOAuth2Clients() as $client) { - if ($client->jwks !== null) { - $this->loadJWKS($client->jwks); - } - } - - $dao = $this->locator->getJWKSDAO(); - return $dao->getAllPublicJWK(); - } - - private function loadJWKS($url) { - - $dao = $this->locator->getJWKSDAO(); - - $conn = curl_init($url); - curl_setopt($conn, CURLOPT_FOLLOWLOCATION, 1); - curl_setopt($conn, CURLOPT_RETURNTRANSFER, true); - - $result = curl_exec($conn); - $info = curl_getinfo($conn); - - if ($info['http_code'] === 200) { - $jwks = json_decode($result, TRUE); - - foreach ($jwks['keys'] as $key) { - $key['url'] = $url; - $jwk = $this->getPublicJWK($key); - $dao->updatePublicJWK($jwk); - } - } else { - error_log('Error while retrieving JWKS from ' . $url); - } - - curl_close($conn); - } - - private function getPublicJWK($data): PublicJWK { - - // Convert Base64 uri-safe variant to default (needed for JWKS) - $n = strtr($data['n'], '-_', '+/'); - - $rsa = new RSA(); - - $key = "<RSAKeyPair>" - . "<Modulus>" . $n . "</Modulus>" - . "<Exponent>" . $data['e'] . "</Exponent>" - . "</RSAKeyPair>"; - - $rsa->loadKey($key, RSA::PUBLIC_FORMAT_XML); - - $jwk = new PublicJWK(); - $jwk->kid = $data['kid']; - $jwk->key = $rsa; - $jwk->url = $data['url']; - $jwk->updateTime = time(); - - return $jwk; - } - } diff --git a/classes/TokenExchanger.php b/classes/TokenExchanger.php index 8aa7ac9c1967388b6492aa5e7eb6eb925362b0cb..fce83c9284661e2db0173d3da71dd134f1d7cc06 100644 --- a/classes/TokenExchanger.php +++ b/classes/TokenExchanger.php @@ -24,8 +24,6 @@ namespace RAP; -use \Firebase\JWT\JWT; - /** * See https://tools.ietf.org/html/rfc8693 */ @@ -70,9 +68,9 @@ class TokenExchanger { if ($params['expires_in'] !== null) { $claims['exp'] = time() + intval($params['expires_in']); } - + $accessToken = $this->locator->getTokenBuilder()->generateToken($claims); - + $data = []; $data['access_token'] = $accessToken; @@ -92,56 +90,4 @@ class TokenExchanger { return $audiences; } - /** - * DEPRECATED (currently used by portals: to be removed) - */ - public function exchangeTokenOld(string $token) { - - $key = $this->getExternalKeyForToken($token); - $decoded = JWT::decode($token, $key->key, ['RS256']); - - $subject = $decoded->sub; - $lifespan = ($decoded->exp - time()); - - $data = []; - - $data['access_token'] = $this->locator->getTokenBuilder()->generateNewToken($subject, $lifespan / 3600, "gms"); - $data['issued_token_type'] = "urn:ietf:params:oauth:token-type:access_token"; - $data['token_type'] = 'Bearer'; - $data['expires_in'] = $lifespan; - - return $data; - } - - private function getExternalKeyForToken(string $token): PublicJWK { - - $keys = $this->locator->getJWKSDAO()->getAllPublicJWK(); - - $parts = explode('.', $token); - $head = JWT::jsonDecode(JWT::urlsafeB64Decode($parts[0])); - - $kid = $head->kid; - - $key = $this->getKeyByKid($keys, $kid); - if ($key === null) { - $keys = $this->locator->getJWKSHandler()->loadAllJWKS(); - } - $key = $this->getKeyByKid($keys, $kid); - - if ($key !== null) { - return $key; - } - - throw new \Exception("Invalid kid"); - } - - private function getKeyByKid(array $keys, string $kid): ?PublicJWK { - foreach ($keys as $key) { - if ($key->kid === $kid) { - return $key; - } - } - return null; - } - } diff --git a/classes/UserHandler.php b/classes/UserHandler.php index 9d8f573122420164675dca7a83225f15e7681d4f..8f27522a2398d6297de19505d44b3957b1ea620c 100644 --- a/classes/UserHandler.php +++ b/classes/UserHandler.php @@ -102,7 +102,7 @@ class UserHandler { return $this->joinNewIdentity($user1, $user2); } - // Call Grouper for moving groups and privileges from one user to the other + // Call GMS for moving groups and privileges from one user to the other $remainingUserId = $this->locator->getGmsClient()->joinGroups($userId1, $userId2); $remainingUser = $userId1 === $remainingUserId ? $user1 : $user2; diff --git a/classes/datalayer/JWKSDAO.php b/classes/datalayer/JWKSDAO.php index a5b52a612b834e745e1396ab8ca3c1ac81a3387f..9cd83f49900a9cfccd8cbadc77caa4116da2e0f2 100644 --- a/classes/datalayer/JWKSDAO.php +++ b/classes/datalayer/JWKSDAO.php @@ -11,8 +11,4 @@ interface JWKSDAO { public function insertRSAKeyPair(RSAKeyPair $keyPair): RSAKeyPair; public function getNewestKeyPair(): ?RSAKeyPair; - - public function getAllPublicJWK(): array; - - public function updatePublicJWK(PublicJWK $jwk); } diff --git a/classes/datalayer/mysql/MySQLJWKSDAO.php b/classes/datalayer/mysql/MySQLJWKSDAO.php index 5611db62ab69e85ec700c51bf174be86f98376e8..8e7a83ad188340b257950396055f12ceee49ec17 100644 --- a/classes/datalayer/mysql/MySQLJWKSDAO.php +++ b/classes/datalayer/mysql/MySQLJWKSDAO.php @@ -85,48 +85,4 @@ class MySQLJWKSDAO extends BaseMySQLDAO implements JWKSDAO { return $keyPair; } - public function getAllPublicJWK(): array { - - $dbh = $this->getDBHandler(); - - $query = "SELECT `kid`, `key`, `url`, `update_time` FROM public_jwk"; - - $stmt = $dbh->prepare($query); - $stmt->execute(); - - $keys = []; - - foreach ($stmt->fetchAll() as $row) { - array_push($keys, $this->getPublicJWKFromResultRow($row)); - } - - return $keys; - } - - private function getPublicJWKFromResultRow($row): PublicJWK { - - $jwk = new PublicJWK (); - $jwk->key = $row['key']; - $jwk->kid = $row['kid']; - $jwk->url = $row['url']; - $jwk->updateTime = $row['update_time']; - return $jwk; - } - - public function updatePublicJWK(PublicJWK $jwk) { - - $dbh = $this->getDBHandler(); - - $query = "INSERT INTO public_jwk(kid, `key`, `url`, update_time) VALUES (:kid, :key, :url, :update_time)" - . " ON DUPLICATE KEY UPDATE `key`=:key, `url`=:url, update_time=:update_time"; - - $stmt = $dbh->prepare($query); - $stmt->bindParam(':kid', $jwk->kid); - $stmt->bindParam(':key', $jwk->key); - $stmt->bindParam(':url', $jwk->url); - $stmt->bindParam(':update_time', $jwk->updateTime); - - $stmt->execute(); - } - } diff --git a/classes/model/BrowserBasedOAuth2Client.php b/classes/model/BrowserBasedOAuth2Client.php index b4ffa124944dc8bea21818e2241d6fe058116539..6edad89b7cb898752f77d8bff0c481aef772d7c7 100644 --- a/classes/model/BrowserBasedOAuth2Client.php +++ b/classes/model/BrowserBasedOAuth2Client.php @@ -35,7 +35,6 @@ class BrowserBasedOAuth2Client extends BrowserBasedClient { public $scope; public $homePage; public $showInHome; - public $jwks; public $scopeAudienceMap = []; public function __construct(object $config) { @@ -48,7 +47,6 @@ class BrowserBasedOAuth2Client extends BrowserBasedClient { $this->homePage = isset($config->home) ? $config->home : null; $this->showInHome = isset($config->showInHome) ? $config->showInHome : false; $this->authMethods = $config->methods; - $this->jwks = isset($config->jwks) ? $config->jwks : null; $this->scopeAudienceMap = isset($config->scopeAudienceMap) ? $config->scopeAudienceMap : null; } diff --git a/classes/model/PublicJWK.php b/classes/model/PublicJWK.php deleted file mode 100644 index c883bf5edd7e79d36b4b6da59b214b730ba0147f..0000000000000000000000000000000000000000 --- a/classes/model/PublicJWK.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php - -namespace RAP; - -class PublicJWK { - - public $kid; - public $key; - public $url; - public $updateTime; - -} diff --git a/config-example.yaml b/config-example.yaml index 87b2554cbe5eed89f78b71f9ee34acbad4e3bac6..fb4208a165bc8598d317583ad90f9fe23a497317 100644 --- a/config-example.yaml +++ b/config-example.yaml @@ -59,7 +59,6 @@ clients: icon: showInHome: true methods: [eduGAIN, Google, Facebook, LinkedIn, X.509, LocalIdP] - jwks: - label: "Asiago Astrophysical Observatory (localhost)" id: aao-dev secret: 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea @@ -69,7 +68,6 @@ clients: icon: asiago.gif showInHome: true methods: [eduGAIN, Google, Facebook, LinkedIn, X.509, LocalIdP] - jwks: http://localhost:8081/aao/jwks cliClients: - id: gms_cli secret: 2a97516c354b68848cdbd8f54a226a0a55b21ed138e207ad6c5cbb9c00aa5aea