Skip to content
This repository was archived by the owner on Aug 7, 2023. It is now read-only.

Commit fd2c8f7

Browse files
Add document
1 parent eec7409 commit fd2c8f7

File tree

5 files changed

+134
-2
lines changed

5 files changed

+134
-2
lines changed

.gitattributes

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
* text=auto
2+
3+
/assets export-ignore
4+
/tests export-ignore
5+
/.gitattributes export-ignore
6+
/.github export-ignore
7+
/.gitignore export-ignore
8+
/phpunit.xml.dist export-ignore
9+
/CHANGELOG.md export-ignore
10+
/README.md export-ignore

README.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# JWT Payload Extractor
2+
3+
![example workflow](https://github.com/php-istio/jwt-payload-extractor/actions/workflows/unit-tests.yml/badge.svg)
4+
![example workflow](https://github.com/php-istio/jwt-payload-extractor/actions/workflows/coding-standards.yml/badge.svg)
5+
[![codecov](https://codecov.io/gh/php-istio/jwt-payload-extractor/branch/main/graph/badge.svg?token=I2ZACWOYHM)](https://codecov.io/gh/php-istio/jwt-payload-extractor)
6+
7+
## About
8+
9+
This library help to extract trusted JWT payload from request forwarded by Istio Envoy proxy. It's based
10+
on [PSR-7 Server Request Message](https://www.php-fig.org/psr/psr-7/) ensures interoperability with other packages and
11+
frameworks.
12+
13+
![UML](assets/request.png)
14+
15+
## Requirements
16+
17+
PHP versions:
18+
19+
+ PHP 8.0
20+
21+
## Installation
22+
23+
First install this library:
24+
25+
```shell
26+
composer require php-istio/jwt-payload-extractor
27+
```
28+
29+
And choice one of PSR-7 implementation package (ex: [nyholm/psr7-server](https://github.com/Nyholm/psr7-server/)):
30+
31+
```shell
32+
composer require nyholm/psr7 nyholm/psr7-server
33+
```
34+
35+
## Usage
36+
37+
Istio CRD [JWTRules](https://istio.io/latest/docs/reference/config/security/jwt/#JWTRule) support forward origin
38+
token (`forwardOriginalToken` option), or just only base64 payload via specify header name
39+
(`outputPayloadToHeader` option), depend on your strategy you need to select method to extract your trusted JWT payload from forwarded request:
40+
41+
+ Extract from origin token in header:
42+
43+
```php
44+
<?php
45+
$psr17Factory = new \Nyholm\Psr7\Factory\Psr17Factory();
46+
47+
$creator = new \Nyholm\Psr7Server\ServerRequestCreator(
48+
$psr17Factory, // ServerRequestFactory
49+
$psr17Factory, // UriFactory
50+
$psr17Factory, // UploadedFileFactory
51+
$psr17Factory // StreamFactory
52+
);
53+
54+
$serverRequest = $creator->fromGlobals();
55+
$extractor = \Istio\JWTPayloadExtractor\ExtractorFactory::fromOriginTokenHeader('issuer.example', 'authorization');
56+
$payload = $extractor->extract($serverRequest);
57+
58+
if(null !== $payload) {
59+
var_dump($payload);
60+
}
61+
```
62+
63+
+ Extract origin token in query param:
64+
65+
```php
66+
<?php
67+
//......
68+
$extractor = \Istio\JWTPayloadExtractor\ExtractorFactory::fromOriginTokenQueryParam('issuer.example', 'token');
69+
$payload = $extractor->extract($serverRequest);
70+
//......
71+
```
72+
73+
+ Extract base64 payload header:
74+
75+
```php
76+
<?php
77+
//......
78+
$extractor = \Istio\JWTPayloadExtractor\ExtractorFactory::fromBase64Header('issuer.example', 'x-istio-jwt-payload');
79+
$payload = $extractor->extract($serverRequest);
80+
//......
81+
```
82+
83+
+ In case your application have many JWT issuers, or many extraction strategies:
84+
85+
```php
86+
<?php
87+
//......
88+
$extractor = \Istio\JWTPayloadExtractor\ExtractorFactory::fromExtractors(
89+
\Istio\JWTPayloadExtractor\ExtractorFactory::fromBase64Header('issuer1.example', 'x-istio-jwt-payload'),
90+
\Istio\JWTPayloadExtractor\ExtractorFactory::fromOriginTokenQueryParam('issuer1.example', 'token'),
91+
\Istio\JWTPayloadExtractor\ExtractorFactory::fromOriginTokenHeader('issuer2.example', 'authorization'),
92+
\Istio\JWTPayloadExtractor\ExtractorFactory::fromOriginTokenQueryParam('issuer3.example', 'token'),
93+
);
94+
$payload = $extractor->extract($serverRequest);
95+
//......
96+
```
97+
98+
## Testing
99+
100+
This library uses [PHPUnit](https://phpunit.de) for unit tests:
101+
102+
```shell
103+
vendor/bin/phpunit
104+
```
105+
106+
## Credits
107+
108+
+ [Minh Vuong](https://github.com/vuongxuongminh)

assets/plantuml/request.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@startuml
2+
[*] --> Istio : Request with JWT
3+
4+
Istio : Check JWT issuer exist in rules
5+
Istio : & validate JWT by issuer JWKS
6+
Istio : & check authorization rules
7+
Istio --> Application : Valid
8+
Istio --> Error : Invalid
9+
10+
Application : Extract and use trusted JWT payload
11+
Application --> [*] : Response
12+
13+
Error --> [*] : Response (401 or 403)
14+
@enduml

assets/request.png

22 KB
Loading

tests/Base64HeaderExtractorTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function testInitWithBlankIssuer(): void
3131
*/
3232
public function testExtractFromInvalidRequests(ServerRequestInterface $inHeader)
3333
{
34-
$extractor = new Base64HeaderExtractor('valid', 'Authorization');
34+
$extractor = new Base64HeaderExtractor('valid', 'authorization');
3535
$payloadFromHeader = $extractor->extract($inHeader);
3636

3737
$this->assertNull($payloadFromHeader);
@@ -42,7 +42,7 @@ public function testExtractFromInvalidRequests(ServerRequestInterface $inHeader)
4242
*/
4343
public function testExtractFromValidRequests(ServerRequestInterface $inHeader)
4444
{
45-
$extractor = new Base64HeaderExtractor('valid', 'Authorization');
45+
$extractor = new Base64HeaderExtractor('valid', 'authorization');
4646
$payloadFromHeader = $extractor->extract($inHeader);
4747

4848
$this->assertIsArray($payloadFromHeader);

0 commit comments

Comments
 (0)