|
1 | 1 | # php-jwk |
| 2 | + |
2 | 3 | A small PHP library to handle JWKs (Json Web Keys) |
| 4 | + |
| 5 | +This library helps to create json web key sets from PEM and is also able to pull out PEMs from json web key sets. |
| 6 | + |
| 7 | +Please note that **only RSA keys are supported at the moment!** |
| 8 | + |
| 9 | +See [JSON Web Key RFC](https://tools.ietf.org/html/rfc7517) for reference. |
| 10 | + |
| 11 | +## Installation |
| 12 | + |
| 13 | +This library requires PHP version 7.2 or higher and can be installed with composer: |
| 14 | + |
| 15 | +```bash |
| 16 | +composer require strobotti/php-jwk |
| 17 | +``` |
| 18 | + |
| 19 | +## Example usage |
| 20 | + |
| 21 | +See full example [here](blob/master/examples/full-flow.php). |
| 22 | + |
| 23 | +### Create a key-object from PEM |
| 24 | + |
| 25 | +```php |
| 26 | +<?php |
| 27 | + |
| 28 | +$pem = <<<'EOT' |
| 29 | +-----BEGIN PUBLIC KEY----- |
| 30 | +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4dGQ7bQK8LgILOdLsYzf |
| 31 | +ZjkEAoQeVC/aqyc8GC6RX7dq/KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdD |
| 32 | +Nq1n52TpxQwI2EqxSk7I9fKPKhRt4F8+2yETlYvye+2s6NeWJim0KBtOVrk0gWvE |
| 33 | +Dgd6WOqJl/yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X+Tip84wqwyRpU |
| 34 | +lq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll+p/Dg8vAXxJLIJ4SNLcqgFeZe |
| 35 | +4OfHLgdzMvxXZJnPp/VgmkcpUdRotazKZumj6dBPcXI/XID4Z4Z3OM1KrZPJNdUh |
| 36 | +xwIDAQAB |
| 37 | +-----END PUBLIC KEY----- |
| 38 | +EOT; |
| 39 | + |
| 40 | +$options = [ |
| 41 | + 'use' => 'sig', |
| 42 | + 'alg' => 'RS256', |
| 43 | + 'kid' => 'eXaunmL', |
| 44 | +]; |
| 45 | + |
| 46 | +$keyFactory = new Strobotti\JWK\KeyFactory(); |
| 47 | +$key = $keyFactory->createFromPem($pem, $options); |
| 48 | + |
| 49 | +echo "$key"; |
| 50 | +``` |
| 51 | + |
| 52 | +Outputs: |
| 53 | + |
| 54 | +```json |
| 55 | +{ |
| 56 | + "kty": "RSA", |
| 57 | + "use": "sig", |
| 58 | + "alg": "RS256", |
| 59 | + "kid": "eXaunmL", |
| 60 | + "n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw", |
| 61 | + "e": "AQAB" |
| 62 | +} |
| 63 | +``` |
| 64 | + |
| 65 | +### Create a JWK set (jwks) from a key |
| 66 | + |
| 67 | +```php |
| 68 | +<?php |
| 69 | +// ...pick up from the previous example |
| 70 | + |
| 71 | +$keySet = new \Strobotti\JWK\KeySet(); |
| 72 | +$keySet->addKey($key); |
| 73 | + |
| 74 | +echo "$keySet" ; |
| 75 | + |
| 76 | +``` |
| 77 | + |
| 78 | +Outputs: |
| 79 | + |
| 80 | +```json |
| 81 | +{ |
| 82 | + "keys": [ |
| 83 | + { |
| 84 | + "kty": "RSA", |
| 85 | + "use": "sig", |
| 86 | + "alg": "RS256", |
| 87 | + "kid": "eXaunmL", |
| 88 | + "n": "4dGQ7bQK8LgILOdLsYzfZjkEAoQeVC_aqyc8GC6RX7dq_KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdDNq1n52TpxQwI2EqxSk7I9fKPKhRt4F8-2yETlYvye-2s6NeWJim0KBtOVrk0gWvEDgd6WOqJl_yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X-Tip84wqwyRpUlq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll-p_Dg8vAXxJLIJ4SNLcqgFeZe4OfHLgdzMvxXZJnPp_VgmkcpUdRotazKZumj6dBPcXI_XID4Z4Z3OM1KrZPJNdUhxw", |
| 89 | + "e": "AQAB" |
| 90 | + } |
| 91 | + ] |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +### Get a key from keyset by `kid` and convert it to PEM |
| 96 | + |
| 97 | +```php |
| 98 | +<?php |
| 99 | +// ...pick up from the previous example |
| 100 | + |
| 101 | +$key = $keySet->getKeyById('eXaunmL'); |
| 102 | +$pem = (new \Strobotti\JWK\KeyConverter())->keyToPem($key); |
| 103 | + |
| 104 | +echo "$pem"; |
| 105 | + |
| 106 | +``` |
| 107 | + |
| 108 | +Outputs: |
| 109 | + |
| 110 | +```text |
| 111 | +-----BEGIN PUBLIC KEY----- |
| 112 | +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4dGQ7bQK8LgILOdLsYzf |
| 113 | +ZjkEAoQeVC/aqyc8GC6RX7dq/KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdD |
| 114 | +Nq1n52TpxQwI2EqxSk7I9fKPKhRt4F8+2yETlYvye+2s6NeWJim0KBtOVrk0gWvE |
| 115 | +Dgd6WOqJl/yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X+Tip84wqwyRpU |
| 116 | +lq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll+p/Dg8vAXxJLIJ4SNLcqgFeZe |
| 117 | +4OfHLgdzMvxXZJnPp/VgmkcpUdRotazKZumj6dBPcXI/XID4Z4Z3OM1KrZPJNdUh |
| 118 | +xwIDAQAB |
| 119 | +-----END PUBLIC KEY----- |
| 120 | +``` |
0 commit comments