Completed
Push — master ( d3f389...b7db91 )
by Дмитрий
03:39
created

Provider::getIdentity()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 30
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 3
Bugs 0 Features 0
Metric Value
dl 0
loc 30
ccs 0
cts 26
cp 0
rs 8.8571
c 3
b 0
f 0
cc 2
eloc 18
nc 2
nop 1
crap 6
1
<?php
2
/**
3
 * SocialConnect project
4
 * @author: Patsura Dmitry https://github.com/ovr <[email protected]>
5
 */
6
7
namespace SocialConnect\Instagram;
8
9
use SocialConnect\Auth\Exception\InvalidAccessToken;
10
use SocialConnect\Auth\Exception\InvalidResponse;
11
use SocialConnect\Auth\Provider\OAuth2\AccessToken;
12
use SocialConnect\Common\Entity\User;
13
use SocialConnect\Common\Http\Client\Client;
14
use SocialConnect\Common\Hydrator\ObjectMap;
15
16
class Provider extends \SocialConnect\Auth\Provider\OAuth2\AbstractProvider
17
{
18
    public function getBaseUri()
19
    {
20
        return 'https://api.instagram.com/v1/';
21
    }
22
23
    public function getAuthorizeUri()
24
    {
25
        return 'https://api.instagram.com/oauth/authorize';
26
    }
27
28
    public function getRequestTokenUri()
29
    {
30
        return 'https://api.instagram.com/oauth/access_token';
31
    }
32
33
    public function getName()
34
    {
35
        return 'instagram';
36
    }
37
38
    /**
39
     * @param string $code
40
     * @return AccessToken
41
     */
42
    public function getAccessToken($code)
43
    {
44
        if (!is_string($code)) {
45
            throw new \InvalidArgumentException('Parameter $code must be a string');
46
        }
47
48
        $parameters = array(
49
            'client_id' => $this->consumer->getKey(),
50
            'client_secret' => $this->consumer->getSecret(),
51
            'grant_type' => 'authorization_code',
52
            'code' => $code,
53
            'redirect_uri' => $this->getRedirectUrl()
54
        );
55
56
        $response = $this->service->getHttpClient()->request($this->getRequestTokenUri(), $parameters, Client::POST);
57
        $body = $response->getBody();
58
59
        return $this->parseToken($body);
60
    }
61
62
    /**
63
     * {@inheritdoc}
64
     */
65
    public function parseToken($body)
66
    {
67
        $result = json_decode($body);
68
        if ($result) {
69
            if (isset($result->access_token) && $result->access_token) {
70
                return new AccessToken($result->access_token);
71
            }
72
73
            throw new InvalidAccessToken('Instagram response with not valid token');
74
        }
75
76
        throw new InvalidAccessToken('AccessToken is not a valid JSON');
77
    }
78
79
    /**
80
     * {@inheritdoc}
81
     */
82
    public function getIdentity(AccessToken $accessToken)
83
    {
84
        $response = $this->service->getHttpClient()->request(
85
            $this->getBaseUri() . 'users/self',
86
            [
87
                'access_token' => $accessToken->getToken()
88
            ]
89
        );
90
91
        if (!$response->isSuccess()) {
92
            throw new InvalidResponse(
93
                'API response with error code',
94
                $response
95
            );
96
        }
97
98
        $body = $response->getBody();
99
        $result = json_decode($body);
100
101
        $hydrator = new ObjectMap(array(
102
            'id' => 'id',
103
            'username' => 'username',
104
            'bio' => 'bio',
105
            'website' => 'website',
106
            'profile_picture' => 'profile_picture',
107
            'full_name' => 'fullname'
108
        ));
109
110
        return $hydrator->hydrate(new User(), $result->data);
111
    }
112
}
113