AuthorizationCodeFlow   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 42
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 20
c 1
b 0
f 0
dl 0
loc 42
rs 10
wmc 6

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __invoke() 0 31 5
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 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
        // \o/ ... Já temos o Access Token ===> $accessToken
51
52
        // Opcionalmente você pode requisitar mais informações do usuário
53
        $userGovBr = $this->govBr->getResourceOwner($accessToken);
54
55
        // Você pode ainda solicitar o avatar (foto)
56
        // $avatar = $this->govBr->getAvatar($userGovBr);
57
58
        return new Json($userGovBr->toArray()); // Sua aplicação decide o que fazer com os dados obtidos
59
    }
60
}
61