Failed Conditions
Push — master ( 516359...a8b39a )
by Florent
04:00
created

AccessTokenRepository   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 226
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 8

Importance

Changes 0
Metric Value
wmc 12
lcom 2
cbo 8
dl 0
loc 226
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2017 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace OAuth2Framework\Component\Server\Tests\Stub;
15
16
use OAuth2Framework\Component\Server\Model\AccessToken\AccessToken;
17
use OAuth2Framework\Component\Server\Model\AccessToken\AccessTokenId;
18
use OAuth2Framework\Component\Server\Model\AccessToken\AccessTokenRepositoryInterface;
19
use OAuth2Framework\Component\Server\Model\Client\ClientId;
20
use OAuth2Framework\Component\Server\Model\DataBag\DataBag;
21
use OAuth2Framework\Component\Server\Model\Event\EventStoreInterface;
22
use OAuth2Framework\Component\Server\Model\RefreshToken\RefreshTokenId;
23
use OAuth2Framework\Component\Server\Model\ResourceOwner\ResourceOwnerId;
24
use OAuth2Framework\Component\Server\Model\ResourceServer\ResourceServerId;
25
use OAuth2Framework\Component\Server\Model\UserAccount\UserAccountId;
26
use SimpleBus\Message\Recorder\RecordsMessages;
27
28
final class AccessTokenRepository implements AccessTokenRepositoryInterface
29
{
30
    /**
31
     * @var EventStoreInterface
32
     */
33
    private $eventStore;
34
35
    /**
36
     * @var RecordsMessages
37
     */
38
    private $eventRecorder;
39
40
    /**
41
     * @var string
42
     */
43
    private $lifetime;
44
45
    /**
46
     * AccessTokenRepository constructor.
47
     *
48
     *
49
     * @param EventStoreInterface $eventStore
50
     * @param RecordsMessages     $eventRecorder
51
     * @param string              $lifetime
52
     */
53
    public function __construct(EventStoreInterface $eventStore, RecordsMessages $eventRecorder, string $lifetime)
54
    {
55
        $this->eventStore = $eventStore;
56
        $this->lifetime = $lifetime;
57
        $this->eventRecorder = $eventRecorder;
58
59
        $this->createAndSaveAccessToken(
60
            AccessTokenId::create('ACCESS_TOKEN_#1'),
61
            UserAccountId::create('john.1'),
62
            ClientId::create('client1'),
63
            DataBag::createFromArray(['token_type' => 'Bearer']),
64
            DataBag::createFromArray([]),
65
            [],
66
            new \DateTimeImmutable('now +3600 seconds'),
67
            null,
68
            ResourceServerId::create('ResourceServer1')
69
        );
70
71
        $this->createRevokedAndSaveAccessToken(
72
            AccessTokenId::create('REVOKED_ACCESS_TOKEN'),
73
            UserAccountId::create('john.1'),
74
            ClientId::create('client1'),
75
            DataBag::createFromArray(['token_type' => 'Bearer']),
76
            DataBag::createFromArray([]),
77
            [],
78
            new \DateTimeImmutable('now +3600 seconds')
79
        );
80
81
        $this->createAndSaveAccessToken(
82
            AccessTokenId::create('ACCESS_TOKEN_#2'),
83
            UserAccountId::create('john.1'),
84
            ClientId::create('client2'),
85
            DataBag::createFromArray([]),
86
            DataBag::createFromArray([]),
87
            [],
88
            new \DateTimeImmutable('now +3600 seconds')
89
        );
90
91
        $this->createAndSaveAccessToken(
92
            AccessTokenId::create('VALID_ACCESS_TOKEN_FOR_USERINFO'),
93
            UserAccountId::create('john.1'),
94
            ClientId::create('client1'),
95
            DataBag::createFromArray(['token_type' => 'Bearer']),
96
            DataBag::createFromArray(['redirect_uri' => 'http://127.0.0.1:8080']),
97
            ['openid', 'profile', 'email', 'phone', 'address'],
98
            new \DateTimeImmutable('now +3600 seconds')
99
        );
100
101
        $this->createAndSaveAccessToken(
102
            AccessTokenId::create('VALID_ACCESS_TOKEN_FOR_SIGNED_USERINFO'),
103
            UserAccountId::create('john.1'),
104
            ClientId::create('client2'),
105
            DataBag::createFromArray(['token_type' => 'Bearer']),
106
            DataBag::createFromArray(['redirect_uri' => 'http://127.0.0.1:8080']),
107
            ['openid', 'profile', 'email', 'phone', 'address'],
108
            new \DateTimeImmutable('now +3600 seconds')
109
        );
110
111
        $this->createAndSaveAccessToken(
112
            AccessTokenId::create('INVALID_ACCESS_TOKEN_FOR_USERINFO'),
113
            UserAccountId::create('john.1'),
114
            ClientId::create('client2'),
115
            DataBag::createFromArray(['token_type' => 'Bearer']),
116
            DataBag::createFromArray(['redirect_uri' => 'http://127.0.0.1:8080']),
117
            [],
118
            new \DateTimeImmutable('now +3600 seconds')
119
        );
120
121
        $this->createAndSaveAccessToken(
122
            AccessTokenId::create('ACCESS_TOKEN_ISSUED_THROUGH_TOKEN_ENDPOINT'),
123
            UserAccountId::create('john.1'),
124
            ClientId::create('client2'),
125
            DataBag::createFromArray(['token_type' => 'Bearer']),
126
            DataBag::createFromArray([]),
127
            ['openid', 'profile', 'email', 'phone', 'address'],
128
            new \DateTimeImmutable('now +3600 seconds')
129
        );
130
    }
131
132
    /**
133
     * {@inheritdoc}
134
     */
135
    public function find(AccessTokenId $accessTokenId)
136
    {
137
        $accessToken = null;
138
        $events = $this->eventStore->getEvents($accessTokenId);
139
        if (!empty($events)) {
140
            $accessToken = AccessToken::createEmpty();
141
            foreach ($events as $event) {
142
                $accessToken = $accessToken->apply($event);
143
            }
144
        }
145
146
        return $accessToken;
147
    }
148
149
    /**
150
     * @param AccessToken $accessToken
151
     */
152
    public function save(AccessToken $accessToken)
153
    {
154
        $events = $accessToken->recordedMessages();
155
        foreach ($events as $event) {
156
            $this->eventStore->save($event);
157
            $this->eventRecorder->record($event);
158
        }
159
        $accessToken->eraseMessages();
160
    }
161
162
    /**
163
     * {@inheritdoc}
164
     */
165
    public function create(ResourceOwnerId $resourceOwnerId, ClientId $clientId, DataBag $parameters, DataBag $metadatas, array $scopes, RefreshTokenId $refreshTokenId = null, ResourceServerId $resourceServerId = null, \DateTimeImmutable $expiresAt = null): AccessToken
166
    {
167
        if (null === $expiresAt) {
168
            $expiresAt = new \DateTimeImmutable($this->lifetime);
169
        }
170
171
        $accessToken = AccessToken::createEmpty();
172
        $accessToken = $accessToken->create(
173
            AccessTokenId::create(bin2hex(random_bytes(50))),
174
            $resourceOwnerId,
175
            $clientId,
176
            $parameters,
177
            $metadatas,
178
            $scopes,
179
            $expiresAt,
180
            $refreshTokenId,
181
            $resourceServerId
182
        );
183
184
        return $accessToken;
185
    }
186
187
    /**
188
     * @param AccessTokenId           $accessTokenId
189
     * @param UserAccountId           $userAccountId
190
     * @param ClientId                $clientId
191
     * @param DataBag                 $parameters
192
     * @param DataBag                 $metadatas
193
     * @param array                   $scopes
194
     * @param \DateTimeImmutable|null $expiresAt
195
     * @param RefreshTokenId|null     $refreshTokenId
196
     * @param ResourceServerId|null   $resourceServerId
197
     */
198
    private function createAndSaveAccessToken(AccessTokenId $accessTokenId, UserAccountId $userAccountId, ClientId $clientId, DataBag $parameters, DataBag $metadatas, array $scopes = [], \DateTimeImmutable $expiresAt = null, RefreshTokenId $refreshTokenId = null, ResourceServerId $resourceServerId = null)
199
    {
200
        $accessToken = AccessToken::createEmpty();
201
        $accessToken = $accessToken->create(
202
            $accessTokenId,
203
            $userAccountId,
204
            $clientId,
205
            $parameters,
206
            $metadatas,
207
            $scopes,
208
            $expiresAt,
209
            $refreshTokenId,
210
            $resourceServerId
211
        );
212
        $events = $accessToken->recordedMessages();
213
        foreach ($events as $event) {
214
            $this->eventStore->save($event);
215
        }
216
        $accessToken->eraseMessages();
217
        $this->save($accessToken);
218
    }
219
220
    /**
221
     * @param AccessTokenId           $accessTokenId
222
     * @param UserAccountId           $userAccountId
223
     * @param ClientId                $clientId
224
     * @param DataBag                 $parameters
225
     * @param DataBag                 $metadatas
226
     * @param array                   $scopes
227
     * @param \DateTimeImmutable|null $expiresAt
228
     * @param RefreshTokenId|null     $refreshTokenId
229
     * @param ResourceServerId|null   $resourceServerId
230
     */
231
    private function createRevokedAndSaveAccessToken(AccessTokenId $accessTokenId, UserAccountId $userAccountId, ClientId $clientId, DataBag $parameters, DataBag $metadatas, array $scopes = [], \DateTimeImmutable $expiresAt = null, RefreshTokenId $refreshTokenId = null, ResourceServerId $resourceServerId = null)
232
    {
233
        $accessToken = AccessToken::createEmpty();
234
        $accessToken = $accessToken->create(
235
            $accessTokenId,
236
            $userAccountId,
237
            $clientId,
238
            $parameters,
239
            $metadatas,
240
            $scopes,
241
            $expiresAt,
242
            $refreshTokenId,
243
            $resourceServerId
244
        );
245
        $accessToken = $accessToken->markAsRevoked();
246
        $events = $accessToken->recordedMessages();
247
        foreach ($events as $event) {
248
            $this->eventStore->save($event);
249
        }
250
        $accessToken->eraseMessages();
251
        $this->save($accessToken);
252
    }
253
}
254