Skip to content

Commit d0d75eb

Browse files
committed
Refactor code for first release
1 parent 9b945e8 commit d0d75eb

21 files changed

+873
-275
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
.phpunit.result.cache
33
composer.lock
44
vendor
5+
coverage.xml

.travis.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@ language: php
22

33
php:
44
- 7.2
5+
- 7.3
56

67
sudo: false
78

8-
before_script: composer install
9-
script: phpunit
9+
before_script:
10+
- composer install
11+
12+
script:
13+
- phpunit
14+
15+
after_success:
16+
- bash <(curl -s https://codecov.io/bash)

README.md

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,120 @@
11
# php-jwk
2+
23
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+
```

examples/full-flow.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
include '../vendor/autoload.php';
4+
5+
use Strobotti\JWK\KeyFactory;
6+
7+
echo "Building an RSA JWK from pem:" . PHP_EOL;
8+
9+
$pem = <<<'EOT'
10+
-----BEGIN PUBLIC KEY-----
11+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4dGQ7bQK8LgILOdLsYzf
12+
ZjkEAoQeVC/aqyc8GC6RX7dq/KvRAQAWPvkam8VQv4GK5T4ogklEKEvj5ISBamdD
13+
Nq1n52TpxQwI2EqxSk7I9fKPKhRt4F8+2yETlYvye+2s6NeWJim0KBtOVrk0gWvE
14+
Dgd6WOqJl/yt5WBISvILNyVg1qAAM8JeX6dRPosahRVDjA52G2X+Tip84wqwyRpU
15+
lq2ybzcLh3zyhCitBOebiRWDQfG26EH9lTlJhll+p/Dg8vAXxJLIJ4SNLcqgFeZe
16+
4OfHLgdzMvxXZJnPp/VgmkcpUdRotazKZumj6dBPcXI/XID4Z4Z3OM1KrZPJNdUh
17+
xwIDAQAB
18+
-----END PUBLIC KEY-----
19+
EOT;
20+
21+
$options = [
22+
'use' => 'sig',
23+
'alg' => 'RS256',
24+
'kid' => 'eXaunmL',
25+
];
26+
27+
$keyFactory = new KeyFactory();
28+
$key = $keyFactory->createFromPem($pem, $options);
29+
30+
echo $key . PHP_EOL . PHP_EOL;
31+
32+
echo "Adding the key to the KeySet:" . PHP_EOL;
33+
34+
$keySet = new \Strobotti\JWK\KeySet();
35+
$keySet->addKey($key);
36+
37+
echo $keySet . PHP_EOL . PHP_EOL;
38+
39+
echo "Fetching the key by it's ID (`kid`) and convert it back to PEM:" . PHP_EOL;
40+
41+
$key = $keySet->getKeyById('eXaunmL');
42+
$pem = (new \Strobotti\JWK\KeyConverter())->keyToPem($key);
43+
44+
echo $pem . PHP_EOL . PHP_EOL;

phpunit.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,12 @@
66
<directory>tests</directory>
77
</testsuite>
88
</testsuites>
9+
<filter>
10+
<whitelist>
11+
<directory>./src/</directory>
12+
</whitelist>
13+
</filter>
14+
<logging>
15+
<log type="coverage-clover" target="clover.xml"/>
16+
</logging>
917
</phpunit>

src/Converter.php

Lines changed: 0 additions & 86 deletions
This file was deleted.

0 commit comments

Comments
 (0)