mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-10-31 03:50:27 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace Tests\Helpers;
 | |
| 
 | |
| use phpseclib3\Crypt\RSA;
 | |
| 
 | |
| /**
 | |
|  * A collection of functions to help with OIDC JWT testing.
 | |
|  * By default, unless overridden, content is provided in a correct working state.
 | |
|  */
 | |
| class OidcJwtHelper
 | |
| {
 | |
|     public static function defaultIssuer(): string
 | |
|     {
 | |
|         return 'https://auth.example.com';
 | |
|     }
 | |
| 
 | |
|     public static function defaultClientId(): string
 | |
|     {
 | |
|         return 'xxyyzz.aaa.bbccdd.123';
 | |
|     }
 | |
| 
 | |
|     public static function defaultPayload(): array
 | |
|     {
 | |
|         return [
 | |
|             'sub'                => 'abc1234def',
 | |
|             'name'               => 'Barry Scott',
 | |
|             'email'              => 'bscott@example.com',
 | |
|             'ver'                => 1,
 | |
|             'iss'                => static::defaultIssuer(),
 | |
|             'aud'                => static::defaultClientId(),
 | |
|             'iat'                => time(),
 | |
|             'exp'                => time() + 720,
 | |
|             'jti'                => 'ID.AaaBBBbbCCCcccDDddddddEEEeeeeee',
 | |
|             'amr'                => ['pwd'],
 | |
|             'idp'                => 'fghfghgfh546456dfgdfg',
 | |
|             'preferred_username' => 'xXBazzaXx',
 | |
|             'auth_time'          => time(),
 | |
|             'at_hash'            => 'sT4jbsdSGy9w12pq3iNYDA',
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public static function idToken($payloadOverrides = [], $headerOverrides = []): string
 | |
|     {
 | |
|         $payload = array_merge(static::defaultPayload(), $payloadOverrides);
 | |
|         $header = array_merge([
 | |
|             'kid' => 'xyz456',
 | |
|             'alg' => 'RS256',
 | |
|         ], $headerOverrides);
 | |
| 
 | |
|         $top = implode('.', [
 | |
|             static::base64UrlEncode(json_encode($header)),
 | |
|             static::base64UrlEncode(json_encode($payload)),
 | |
|         ]);
 | |
| 
 | |
|         $privateKey = static::privateKeyInstance();
 | |
|         $signature = $privateKey->sign($top);
 | |
| 
 | |
|         return $top . '.' . static::base64UrlEncode($signature);
 | |
|     }
 | |
| 
 | |
|     public static function privateKeyInstance()
 | |
|     {
 | |
|         static $key;
 | |
|         if (is_null($key)) {
 | |
|             $key = RSA::loadPrivateKey(static::privatePemKey())->withPadding(RSA::SIGNATURE_PKCS1);
 | |
|         }
 | |
| 
 | |
|         return $key;
 | |
|     }
 | |
| 
 | |
|     public static function base64UrlEncode(string $decoded): string
 | |
|     {
 | |
|         return strtr(base64_encode($decoded), '+/', '-_');
 | |
|     }
 | |
| 
 | |
|     public static function publicPemKey(): string
 | |
|     {
 | |
|         return '-----BEGIN PUBLIC KEY-----
 | |
| MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqo1OmfNKec5S2zQC4SP9
 | |
| DrHuUR0VgCi6oqcGERz7zqO36hqk3A3R3aCgJkEjfnbnMuszRRKs45NbXoOp9pvm
 | |
| zXL16c93Obn7G8x8A3ao6yN5qKO5S5+CETqOZfKN/g75Xlz7VsC3igOhgsXnPx6i
 | |
| iM6sbYbk0U/XpFaT84LXKI8VTIPUo7gTeZN1pTET//i9FlzAOzX+xfWBKdOqlEzl
 | |
| +zihMHCZUUvQu99P+o0MDR0lMUT+vPJ6SJeRfnoHexwt6bZFiNnsZIEL03bX4QNk
 | |
| WvsLta1+jNUee+8IPVhzCO8bvM86NzLaKUJ4k6NZ5IVrmdCFpFsjCWByOrDG8wdw
 | |
| 3wIDAQAB
 | |
| -----END PUBLIC KEY-----';
 | |
|     }
 | |
| 
 | |
|     public static function privatePemKey(): string
 | |
|     {
 | |
|         return '-----BEGIN PRIVATE KEY-----
 | |
| MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqjU6Z80p5zlLb
 | |
| NALhI/0Ose5RHRWAKLqipwYRHPvOo7fqGqTcDdHdoKAmQSN+ducy6zNFEqzjk1te
 | |
| g6n2m+bNcvXpz3c5ufsbzHwDdqjrI3moo7lLn4IROo5l8o3+DvleXPtWwLeKA6GC
 | |
| xec/HqKIzqxthuTRT9ekVpPzgtcojxVMg9SjuBN5k3WlMRP/+L0WXMA7Nf7F9YEp
 | |
| 06qUTOX7OKEwcJlRS9C730/6jQwNHSUxRP688npIl5F+egd7HC3ptkWI2exkgQvT
 | |
| dtfhA2Ra+wu1rX6M1R577wg9WHMI7xu8zzo3MtopQniTo1nkhWuZ0IWkWyMJYHI6
 | |
| sMbzB3DfAgMBAAECggEADm7K2ghWoxwsstQh8j+DaLzx9/dIHIJV2PHdd5FGVeRQ
 | |
| 6gS7MswQmHrBUrtsb4VMZ2iz/AJqkw+jScpGldH3pCc4XELsSfxNHbseO4TNIqjr
 | |
| 4LOKOLYU4bRc3I+8KGXIAI5JzrucTJemEVUCDrte8cjbmqExt+zTyNpyxsapworF
 | |
| v+vnSdv40d62f+cS1xvwB+ymLK/B/wZ/DemDCi8jsi7ou/M7l5xNCzjH4iMSLtOW
 | |
| fgEhejIBG9miMJWPiVpTXE3tMdNuN3OsWc4XXm2t4VRovlZdu30Fax1xWB+Locsv
 | |
| HlHKLOFc8g+jZh0TL2KCNjPffMcC7kHhW3afshpIsQKBgQDhyWUnkqd6FzbwIX70
 | |
| SnaMgKoUv5W/K5T+Sv/PA2CyN8Gu8ih/OsoNZSnI0uqe3XQIvvgN/Fq3wO1ttLzf
 | |
| z5B6ZC7REfTgcR0190gihk6f5rtcj7d6Fy/oG2CE8sDSXgPnpEaBjvJVgN5v/U2s
 | |
| HpVaidmHTyGLCfEszoeoy8jyrQKBgQDBX8caGylmzQLc6XNntZChlt3e18Nj8MPA
 | |
| DxWLcoqgdDoofLDQAmLl+vPKyDmhQjos5eas1jgmVVEM4ge+MysaVezvuLBsSnOh
 | |
| ihc0i63USU6i7YDE83DrCewCthpFHi/wW1S5FoCAzpVy8y99vwcqO4kOXcmf4O6Y
 | |
| uW6sMsjvOwKBgQDbFtqB+MtsLCSSBF61W6AHHD5tna4H75lG2623yXZF2NanFLF5
 | |
| K6muL9DI3ujtOMQETJJUt9+rWJjLEEsJ/dYa/SV0l7D/LKOEnyuu3JZkkLaTzZzi
 | |
| 6qcA2bfhqdCzEKlHV99WjkfV8hNlpex9rLuOPB8JLh7FVONicBGxF/UojQKBgDXs
 | |
| IlYaSuI6utilVKQP0kPtEPOKERc2VS+iRSy8hQGXR3xwwNFQSQm+f+sFCGT6VcSd
 | |
| W0TI+6Fc2xwPj38vP465dTentbKM1E+wdSYW6SMwSfhO6ECDbfJsst5Sr2Kkt1N7
 | |
| 9FUkfDLu6GfEfnK/KR1SurZB2u51R7NYyg7EnplvAoGAT0aTtOcck0oYN30g5mdf
 | |
| efqXPwg2wAPYeiec49EbfnteQQKAkqNfJ9K69yE2naf6bw3/5mCBsq/cXeuaBMII
 | |
| ylysUIRBqt2J0kWm2yCpFWR7H+Ilhdx9A7ZLCqYVt8e+vjO/BOI3cQDe2VPOLPSl
 | |
| q/1PY4iJviGKddtmfClH3v4=
 | |
| -----END PRIVATE KEY-----';
 | |
|     }
 | |
| 
 | |
|     public static function publicJwkKeyArray(): array
 | |
|     {
 | |
|         return [
 | |
|             'kty' => 'RSA',
 | |
|             'alg' => 'RS256',
 | |
|             'kid' => '066e52af-8884-4926-801d-032a276f9f2a',
 | |
|             'use' => 'sig',
 | |
|             'e'   => 'AQAB',
 | |
|             'n'   => 'qo1OmfNKec5S2zQC4SP9DrHuUR0VgCi6oqcGERz7zqO36hqk3A3R3aCgJkEjfnbnMuszRRKs45NbXoOp9pvmzXL16c93Obn7G8x8A3ao6yN5qKO5S5-CETqOZfKN_g75Xlz7VsC3igOhgsXnPx6iiM6sbYbk0U_XpFaT84LXKI8VTIPUo7gTeZN1pTET__i9FlzAOzX-xfWBKdOqlEzl-zihMHCZUUvQu99P-o0MDR0lMUT-vPJ6SJeRfnoHexwt6bZFiNnsZIEL03bX4QNkWvsLta1-jNUee-8IPVhzCO8bvM86NzLaKUJ4k6NZ5IVrmdCFpFsjCWByOrDG8wdw3w',
 | |
|         ];
 | |
|     }
 | |
| }
 |