Passed
Pull Request — master (#1316)
by
unknown
37:37 queued 02:44
created

IdTokenResponse::isOpenIDRequest()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 5
c 0
b 0
f 0
nc 4
nop 1
dl 0
loc 11
rs 10
1
<?php
2
3
namespace League\OAuth2\Server\ResponseTypes;
4
5
use Lcobucci\JWT\Signer\Key\InMemory;
6
use Lcobucci\JWT\Signer\Rsa\Sha256;
7
use League\Event\EmitterAwareTrait;
8
use League\Event\EmitterInterface;
9
use League\OAuth2\Server\ClaimExtractor;
10
use League\OAuth2\Server\ClaimExtractorIntercace;
11
use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
12
use League\OAuth2\Server\Entities\ClaimSetInterface;
13
use League\OAuth2\Server\Entities\ScopeEntityInterface;
14
use League\OAuth2\Server\IdTokenClaimsCreatedEvent;
15
use League\OAuth2\Server\IdTokenEvent;
16
use League\OAuth2\Server\IdTokenIssuedEvent;
17
use League\OAuth2\Server\Repositories\ClaimSetRepositoryInterface;
18
use League\OAuth2\Server\Repositories\IdTokenRepositoryInterface;
19
20
/**
21
 * OpenidConfigurationResponse
22
 *
23
 * @link https://github.com/steverhoades/oauth2-openid-connect-server
24
 *
25
 * @author Steve Rhoades <[email protected]>
26
 * @author Marc Riemer <[email protected]>
27
 */
28
class IdTokenResponse extends BearerTokenResponse
29
{
30
    use EmitterAwareTrait;
31
32
    /**
33
     * IdTokenRepositoryInterface
34
     *
35
     * @var IdTokenRepositoryInterface
36
     */
37
    protected $builder;
38
39
    /**
40
     * ClaimSetRepositoryInterface
41
     *
42
     * @var ClaimSetRepositoryInterface
43
     */
44
    protected $claimRepository;
45
46
    /**
47
     * EmitterInterface
48
     *
49
     * @var EmitterInterface
50
     */
51
    protected $emitter;
52
53
    /**
54
     * ClaimExtractorIntercace
55
     *
56
     * @var ClaimExtractorIntercace
57
     */
58
    protected $extractor;
59
60
    public function __construct(
61
        IdTokenRepositoryInterface $builder,
62
        ClaimSetRepositoryInterface $claimRepository,
63
        EmitterInterface $emitter,
64
        ?ClaimExtractorIntercace $extractor = null
65
    ) {
66
        if (!$extractor) {
67
            $this->extractor = new ClaimExtractor();
68
        } else {
69
            $this->extractor = $extractor;
70
        }
71
        $this->builder = $builder;
72
        $this->claimRepository = $claimRepository;
73
        $this->setEmitter($emitter);
74
    }
75
76
    /**
77
     * @param AccessTokenEntityInterface $accessToken
78
     *
79
     * @return array
80
     */
81
    protected function getExtraParams(AccessTokenEntityInterface $accessToken): array
82
    {
83
        // Onyly add id_token to openid scopes
84
        if (!self::isOpenIDRequest($accessToken->getScopes())) {
85
            return [];
86
        }
87
88
        $claimSet = $this->claimRepository->getClaimSetEntry($accessToken);
89
90
        $builder = $this->builder->getBuilder($accessToken);
91
92
        if ($claimSet instanceof ClaimSetInterface) {
0 ignored issues
show
introduced by
$claimSet is always a sub-type of League\OAuth2\Server\Entities\ClaimSetInterface.
Loading history...
93
            foreach ($this->extractor->extract($accessToken->getScopes(), $claimSet->getClaims()) as $claimName => $claimValue) {
94
                $builder->withClaim($claimName, $claimValue);
95
            }
96
        }
97
98
        $this->getEmitter()->emit(
99
            new IdTokenClaimsCreatedEvent(IdTokenEvent::ID_TOKEN_CLAIMS_CREATED, $builder)
100
        );
101
102
        $token = $builder->getToken(
103
            new Sha256(),
104
            InMemory::file($this->privateKey->getKeyPath(), (string) $this->privateKey->getPassPhrase())
105
        );
106
107
        $this->getEmitter()->emit(
108
            new IdTokenIssuedEvent(IdTokenEvent::ID_TOKEN_ISSUED, $token)
109
        );
110
111
        return [
112
            'id_token' => $token->toString(),
113
        ];
114
    }
115
116
    /**
117
     * Return true If this is an OpenID request
118
     *
119
     * @param ScopeEntityInterface[] $scopes
120
     *
121
     * @return bool
122
     */
123
    private static function isOpenIDRequest($scopes): bool
124
    {
125
        foreach ($scopes as $scope) {
126
            if ($scope instanceof ScopeEntityInterface) {
127
                if ($scope->getIdentifier() === 'openid') {
128
                    return true;
129
                }
130
            }
131
        }
132
133
        return false;
134
    }
135
}
136