|
6 | 6 |
|
7 | 7 | use Symfony\Component\Uid\Uuid; |
8 | 8 | use Tempest\Clock\Clock; |
| 9 | +use Tempest\Core\AppConfig; |
| 10 | +use Tempest\Http\Cookie\Cookie; |
9 | 11 | use Tempest\Http\Cookie\CookieManager; |
10 | | -use Tempest\Http\Session\Session; |
| 12 | +use Tempest\Http\Cookie\SameSite; |
11 | 13 | use Tempest\Http\Session\SessionConfig; |
12 | 14 | use Tempest\Http\Session\SessionId; |
13 | 15 | use Tempest\Http\Session\SessionIdResolver; |
14 | 16 |
|
| 17 | +use function Tempest\Support\str; |
| 18 | + |
15 | 19 | final readonly class CookieSessionIdResolver implements SessionIdResolver |
16 | 20 | { |
17 | 21 | public function __construct( |
| 22 | + private AppConfig $appConfig, |
18 | 23 | private CookieManager $cookies, |
19 | 24 | private SessionConfig $sessionConfig, |
20 | 25 | private Clock $clock, |
21 | 26 | ) {} |
22 | 27 |
|
23 | 28 | public function resolve(): SessionId |
24 | 29 | { |
25 | | - $id = $this->cookies->get(Session::ID)->value ?? null; |
| 30 | + $sessionKey = str($this->appConfig->name ?? 'tempest') |
| 31 | + ->snake() |
| 32 | + ->append('_session_id') |
| 33 | + ->toString(); |
| 34 | + |
| 35 | + $id = $this->cookies->get($sessionKey)->value ?? null; |
26 | 36 |
|
27 | 37 | if (! $id) { |
28 | 38 | $id = (string) Uuid::v4(); |
29 | 39 |
|
30 | | - $this->cookies->set( |
31 | | - key: Session::ID, |
| 40 | + $this->cookies->add(new Cookie( |
| 41 | + key: $sessionKey, |
32 | 42 | value: $id, |
33 | | - expiresAt: $this->clock->now()->plusSeconds($this->sessionConfig->expirationInSeconds), |
34 | | - ); |
| 43 | + path: '/', |
| 44 | + secure: true, |
| 45 | + httpOnly: true, |
| 46 | + expiresAt: $this->clock->now()->plus($this->sessionConfig->expiration), |
| 47 | + sameSite: SameSite::LAX, |
| 48 | + )); |
35 | 49 | } |
36 | 50 |
|
37 | 51 | return new SessionId($id); |
|
0 commit comments