Passed
Push — main ( 2422e5...cb64d0 )
by Breno
01:40
created

AuthorizationCodeFlow::__invoke()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 15
c 1
b 0
f 0
nc 4
nop 1
dl 0
loc 25
rs 9.4555
1
<?php
2
declare(strict_types=1);
3
4
namespace BrenoRoosevelt\OAuth2\Client\Example;
5
6
use BrenoRoosevelt\OAuth2\Client\GovBr;
7
use Laminas\Diactoros\Response\JsonResponse as Json;
8
use Laminas\Diactoros\Response\RedirectResponse as Redirect;
9
use League\OAuth2\Client\Grant\AuthorizationCode;
10
use Psr\Http\Message\ResponseInterface as Response;
11
use Psr\Http\Message\ServerRequestInterface as Request;
12
use Throwable;
13
14
/**
15
 * Exemplo do fluxo Authorization Code.
16
 */
17
final class AuthorizationCodeFlow
18
{
19
    private $govBr;
20
    private $stateStorage;
21
22
    public function __construct(GovBr $govBr, StateStorage $stateStorage)
23
    {
24
        $this->govBr = $govBr;
25
        $this->stateStorage = $stateStorage;
26
    }
27
28
    public function __invoke(Request $request): Response
29
    {
30
        $authorizationCode = $request->getQueryParams()['code'] ?? null;
31
        if (empty($authorizationCode)) { // Se não temos um código de autorização, vamos obter um
32
            $url = $this->govBr->getAuthorizationUrl();
33
            $this->stateStorage->store($this->govBr->getState());
34
            return new Redirect($url); // redireciona o usuário para obter a autorização
35
        }
36
37
        $state = $request->getQueryParams()['state'] ?? null;
38
        if (empty($state) || !$this->stateStorage->has($state)) { // Possível ataque CSRF em andamento
39
            $this->stateStorage->clear();
40
            return new Json(['error' => 'Invalid state'], 401);
41
        }
42
43
        // Obtém o access Access Token usando o Authorization Code
44
        try {
45
            $accessToken = $this->govBr->getAccessToken(new AuthorizationCode(), ['code' => $authorizationCode]);
46
        } catch (Throwable $e) {
47
            return new Json(['error' => $e->getMessage()], 401); // Erro ao obter o Access Token
48
        }
49
50
        $userGovBr = $this->govBr->getResourceOwner($accessToken); //Opcional: mais informações do usuário
51
52
        return new Json($userGovBr->toArray()); // Sua aplicação decide o que fazer com os dados obtidos
53
    }
54
}
55