MDL-69542 libraries: Add the LTI 1.3 library
[moodle.git] / lib / lti1p3 / src / JwksEndpoint.php
blobd228c1054eb3c273615a605dd39bf15e34e2f666
1 <?php
3 namespace Packback\Lti1p3;
5 use Firebase\JWT\JWT;
6 use Packback\Lti1p3\Interfaces\IDatabase;
7 use Packback\Lti1p3\Interfaces\ILtiRegistration;
9 class JwksEndpoint
11 private $keys;
13 public function __construct(array $keys)
15 $this->keys = $keys;
18 public static function new(array $keys)
20 return new JwksEndpoint($keys);
23 public static function fromIssuer(IDatabase $database, $issuer)
25 $registration = $database->findRegistrationByIssuer($issuer);
27 return new JwksEndpoint([$registration->getKid() => $registration->getToolPrivateKey()]);
30 public static function fromRegistration(ILtiRegistration $registration)
32 return new JwksEndpoint([$registration->getKid() => $registration->getToolPrivateKey()]);
35 public function getPublicJwks()
37 $jwks = [];
38 foreach ($this->keys as $kid => $private_key) {
39 $key_res = openssl_pkey_get_private($private_key);
40 $key_details = openssl_pkey_get_details($key_res);
41 $components = [
42 'kty' => 'RSA',
43 'alg' => 'RS256',
44 'use' => 'sig',
45 'e' => JWT::urlsafeB64Encode($key_details['rsa']['e']),
46 'n' => JWT::urlsafeB64Encode($key_details['rsa']['n']),
47 'kid' => $kid,
49 $jwks[] = $components;
52 return ['keys' => $jwks];
55 public function outputJwks()
57 echo json_encode($this->getPublicJwks());