Laravel AT Protocol Client (alpha & unstable)
1<?php
2
3namespace SocialDept\AtpClient\Auth;
4
5use Firebase\JWT\JWT;
6
7class ClientAssertionManager
8{
9 public function __construct(
10 protected ClientMetadataManager $metadata,
11 ) {}
12
13 /**
14 * Check if client assertion is required (private key is configured)
15 */
16 public function isRequired(): bool
17 {
18 return ! empty(config('client.oauth.private_key'));
19 }
20
21 /**
22 * Create a client assertion JWT for private_key_jwt authentication
23 */
24 public function createAssertion(string $audience): string
25 {
26 $key = OAuthKey::load();
27 $now = time();
28
29 $payload = [
30 'iss' => $this->metadata->getClientId(),
31 'sub' => $this->metadata->getClientId(),
32 'aud' => $audience,
33 'jti' => bin2hex(random_bytes(16)),
34 'iat' => $now,
35 'exp' => $now + 60,
36 ];
37
38 $header = [
39 'alg' => 'ES256',
40 'kid' => config('client.oauth.kid', 'atp-client-key'),
41 'typ' => 'JWT',
42 ];
43
44 return JWT::encode(
45 payload: $payload,
46 key: $key->toPEM(),
47 alg: 'ES256',
48 head: $header
49 );
50 }
51
52 /**
53 * Get the client assertion type for OAuth requests
54 */
55 public function getAssertionType(): string
56 {
57 return 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';
58 }
59
60 /**
61 * Get client authentication parameters for OAuth requests
62 */
63 public function getAuthParams(string $audience): array
64 {
65 if (! $this->isRequired()) {
66 return [
67 'client_id' => $this->metadata->getClientId(),
68 ];
69 }
70
71 return [
72 'client_id' => $this->metadata->getClientId(),
73 'client_assertion_type' => $this->getAssertionType(),
74 'client_assertion' => $this->createAssertion($audience),
75 ];
76 }
77}