JwtBearer::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4286
cc 2
eloc 4
nc 2
nop 2
crap 2
1
<?php
2
3
namespace CommerceGuys\Guzzle\Oauth2\GrantType;
4
5
use GuzzleHttp\ClientInterface;
6
use JWT;
7
use SplFileObject;
8
use InvalidArgumentException;
9
10
/**
11
 * JSON Web Token (JWT) Bearer Token Profiles for OAuth 2.0
12
 *
13
 * @link http://tools.ietf.org/html/draft-jones-oauth-jwt-bearer-04
14
 */
15
class JwtBearer extends GrantTypeBase
16
{
17
    protected $grantType = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
18
19
    /**
20
     * @param ClientInterface $client
21
     * @param array           $config
22
     */
23 3
    public function __construct(ClientInterface $client, array $config = [])
24
    {
25 3
        parent::__construct($client, $config);
26
27 2
        if (!($this->config->get('private_key') instanceof SplFileObject)) {
28 1
            throw new InvalidArgumentException('private_key needs to be instance of SplFileObject');
29
        }
30 1
    }
31
32
    /**
33
     * @inheritdoc
34
     */
35 3
    protected function getRequired()
36
    {
37 3
        return array_merge(parent::getRequired(), ['private_key']);
38
    }
39
40
    /**
41
     * @inheritdoc
42
     */
43 1
    protected function getAdditionalOptions()
44
    {
45
        return [
46
            'body' => [
47 1
                'assertion' => $this->computeJwt()
48 1
            ]
49 1
        ];
50
    }
51
52
    /**
53
     * Compute JWT, signing with provided private key
54
     */
55 1
    protected function computeJwt()
56
    {
57
        $payload = [
58 1
            'iss' => $this->config->get('client_id'),
59 1
            'aud' => sprintf('%s/%s', rtrim($this->client->getBaseUrl(), '/'), ltrim($this->config->get('token_url'), '/')),
60 1
            'exp' => time() + 60 * 60,
61 1
            'iat' => time()
62 1
        ];
63
64 1
        return JWT::encode($payload, $this->readPrivateKey($this->config->get('private_key')), 'RS256');
65
    }
66
67
    /**
68
     * Read private key
69
     *
70
     * @param SplFileObject $privateKey
71
     *
72
     * @return string
73
     */
74 1
    protected function readPrivateKey(SplFileObject $privateKey)
75
    {
76 1
        $key = '';
77 1
        while (!$privateKey->eof()) {
78 1
            $key .= $privateKey->fgets();
79 1
        }
80 1
        return $key;
81
    }
82
}
83