Skip to content

Commit 4dd8301

Browse files
authored
Merge pull request #2 from stechstudio/Signer_And_Formatter_Config
Signer and formatter config
2 parents 4c5430c + 1b63ba8 commit 4dd8301

File tree

6 files changed

+152
-8
lines changed

6 files changed

+152
-8
lines changed

config/jwt.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
<?php
2+
3+
use Lcobucci\JWT\Encoding\ChainedFormatter;
4+
25
return [
36
// Look for a dedicated signing key, fall back to app key
47
'key' => env('JWT_SIGNING_KEY', env('APP_KEY')),
58

9+
// Default Signer class
10+
'signer' => \Lcobucci\JWT\Signer\Hmac\Sha256::class,
11+
612
// Default lifetime in seconds
713
'lifetime' => env('JWT_LIFETIME', 600),
814

@@ -17,5 +23,7 @@
1723
'validate' => [
1824
// If you really need to avoid automatic audience validation
1925
'audience' => env('JWT_VALIDATE_AUDIENCE', true),
20-
]
21-
];
26+
],
27+
28+
'chained_formatter' => ChainedFormatter::default(),
29+
];

src/Client.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
use Illuminate\Support\Traits\ForwardsCalls;
1212
use Lcobucci\JWT\Encoding\ChainedFormatter;
1313
use Lcobucci\JWT\Encoding\JoseEncoder;
14-
use Lcobucci\JWT\Signer\Hmac\Sha256;
14+
use Lcobucci\JWT\Signer;
1515
use Lcobucci\JWT\Signer\Key\InMemory;
1616
use Lcobucci\JWT\Token\Builder;
1717
use Lcobucci\JWT\Token\Plain;
@@ -28,11 +28,13 @@ class Client
2828

2929
public function __construct(
3030
protected string $signingKey,
31+
protected Signer $signer,
32+
protected ChainedFormatter $chainedFormatter,
3133
protected int|CarbonImmutable $lifetime,
3234
protected string $issuer,
3335
protected string $audience)
3436
{
35-
$this->builder = new Builder(new JoseEncoder(), ChainedFormatter::default());
37+
$this->builder = new Builder(new JoseEncoder(), $this->chainedFormatter);
3638
}
3739

3840
public function signWith(string $signingKey): self
@@ -64,7 +66,7 @@ public function getToken(): Plain
6466
in_array('issuedBy', $this->configures) || $this->issuedBy($this->issuer());
6567
in_array('expiresAt', $this->configures) || $this->lifetime($this->lifetime);
6668

67-
return $this->builder->getToken(new Sha256(), InMemory::plainText($this->signingKey()));
69+
return $this->builder->getToken($this->signer, InMemory::plainText($this->signingKey()));
6870
}
6971

7072
public function __toString(): string
@@ -127,4 +129,4 @@ public function parse(string $jwt): ParsedToken
127129
{
128130
return ParsedToken::fromString($jwt);
129131
}
130-
}
132+
}

src/JWTServiceProvider.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,13 @@ public function register(): void
3636
$key = base64_decode(substr($key, 7));
3737
}
3838

39+
$signer = config('jwt.signer');
40+
$chainedFormatter = config('jwt.chained_formatter');
41+
3942
return new Client(
4043
$key,
44+
new $signer(),
45+
$chainedFormatter,
4146
config('jwt.lifetime'),
4247
config('jwt.issuer'),
4348
config('jwt.audience')
@@ -49,4 +54,4 @@ public function provides(): array
4954
{
5055
return [Client::class];
5156
}
52-
}
57+
}

tests/ClientTest.php

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use Carbon\Carbon;
44
use Carbon\CarbonImmutable;
5+
use Lcobucci\JWT\Encoding\ChainedFormatter;
56
use Lcobucci\JWT\Encoding\JoseEncoder;
67
use Lcobucci\JWT\Signer\Hmac\Sha256;
78
use Lcobucci\JWT\Signer\Key\InMemory;
@@ -32,6 +33,8 @@ protected function getEnvironmentSetUp($app): void
3233
'audience' => 'myappaud',
3334
'issuer' => 'myappiss',
3435
'lifetime' => 900,
36+
'signer' => \Lcobucci\JWT\Signer\Hmac\Sha256::class,
37+
'chained_formatter' => ChainedFormatter::default(),
3538
]]);
3639
}
3740

@@ -113,6 +116,66 @@ public function testLifetime()
113116
$this->assertTrue($token->isExpired(CarbonImmutable::now()->addMinutes(5)));
114117
}
115118

119+
public function testDefaultSigner()
120+
{
121+
$token = JWT::expiresAt(Carbon::now()->addMinutes(10))->getToken();
122+
123+
$this->assertTrue(
124+
(new Validator())->validate(
125+
$token,
126+
new SignedWith(new Sha256(), InMemory::plainText("thisissigningkeythisissigningkey"))
127+
)
128+
);
129+
}
130+
131+
public function testRsaSha256Signer()
132+
{
133+
$rsa = new \Lcobucci\JWT\Signer\Rsa\Sha256();
134+
$privateKey = file_get_contents(__DIR__ . '/keys/jwtRS256.key');
135+
$publicKey = InMemory::plainText(file_get_contents(__DIR__ . '/keys/jwtRS256.key.pub'));
136+
137+
config(['jwt.signer' => \Lcobucci\JWT\Signer\Rsa\Sha256::class]);
138+
139+
$token = JWT::get('test-id', ['foo' => 'bar'], 1800, $privateKey);
140+
141+
$parsedToken = (new Parser(new JoseEncoder()))->parse($token);
142+
143+
$this->assertTrue(
144+
(new Validator())->validate(
145+
$parsedToken,
146+
new SignedWith($rsa, $publicKey)
147+
)
148+
);
149+
}
150+
151+
public function testDefaultTimestampFormatter()
152+
{
153+
$time = Carbon::now()->addMinutes(10);
154+
$token = JWT::expiresAt($time)->getToken();
155+
156+
$parts = array_map('base64_decode', explode('.', $token->toString()));
157+
158+
$this->assertEquals(
159+
$time->format('U.u'),
160+
json_decode($parts[1])->exp
161+
);
162+
}
163+
164+
public function testUnixTimestampFormatter()
165+
{
166+
config(['jwt.chained_formatter' => ChainedFormatter::withUnixTimestampDates()]);
167+
168+
$time = Carbon::now()->addMinutes(10);
169+
$token = JWT::expiresAt($time)->getToken();
170+
171+
$parts = array_map('base64_decode', explode('.', $token->toString()));
172+
173+
$this->assertEquals(
174+
$time->format('U'),
175+
json_decode($parts[1])->exp
176+
);
177+
}
178+
116179
public function testQuickGet()
117180
{
118181
$jwt = JWT::get('test-id', ['foo' => 'bar'], 1800);
@@ -132,4 +195,5 @@ public function testQuickGet()
132195
)
133196
);
134197
}
135-
}
198+
}
199+

tests/keys/jwtRS256.key

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
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
51+
-----END RSA PRIVATE KEY-----

tests/keys/jwtRS256.key.pub

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt/kVyHFiIz1uQdiL2ECX
3+
xVGqy2brucaCmp5Tp1uVvgx17v/x2fhzBqBSJvpZ37s41klVQP1ZMLoqoB9jkuui
4+
KJxnjCJMA7YQZEwI9Z+mZETdnDF10IY/uC+9aGGmDdcDoKjkPKsXcjNypZpclHWn
5+
hmeY4+L+Ep9fdx4ust5j0lYIaEZaInM0itZrepVENjMwFCsnr7DZNZSuWljZ9gqu
6+
D1A20uLOutTxCRpRB/3I+qOwUdHRG3w6hyE4pLNhqWsjVMVCYps9e/YePmBuDnUR
7+
RWe/5Kpnai/ojVzKjDzn+z2Y9F8htR46Tpg/3PUpNcEwK2WOFN4CaJsC7leXy5TO
8+
4U/f9sBlJ/ER5Z9CMIZKInK+QvOJwExelyWfDZzGuTfRHxWl/HuNQLUKciuqzwKj
9+
DfV4wEdQjz7SaLyTjAQzy9ZArylA3pEzJmlnWVdCTi5Xt+q5mWtfbZUY+XeIuvjq
10+
A1u/dCXiPpArQgpTfwb3CKxLiXRvRV73UQ3moTNS/4XP33eqY0HXlmW9HvhUVhty
11+
AT6/zLbRx+dLyq89kvgt1kUXke4cRxDbrajlKurrQSSp8BZ+MQQrvT1cucuNAjhz
12+
OQw/Jlj4Is6OgoUAENX4az0TjWmhb41gplZGfhfF7f5YHattY55HH/jovB5mO2Jy
13+
jOJhDZN3soMdwwO4lYysZz0CAwEAAQ==
14+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)