Completed
Push — master ( 0095fb...15ea44 )
by Дмитрий
04:21
created

Odnoklassniki   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Test Coverage

Coverage 59.18%

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 10
dl 0
loc 120
ccs 29
cts 49
cp 0.5918
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getBaseUri() 0 4 1
A getAuthorizeUri() 0 4 1
A getRequestTokenUri() 0 4 1
A getName() 0 4 1
A parseToken() 0 13 3
A makeSecureSignature() 0 16 3
B getIdentity() 0 41 3
1
<?php
2
/**
3
 * SocialConnect project
4
 * @author: Patsura Dmitry https://github.com/ovr <[email protected]>
5
 */
6
7
namespace SocialConnect\OAuth2\Provider;
8
9
use SocialConnect\Provider\AccessTokenInterface;
10
use SocialConnect\Provider\Exception\InvalidAccessToken;
11
use SocialConnect\Provider\Exception\InvalidResponse;
12
use SocialConnect\OAuth2\AccessToken;
13
use SocialConnect\Common\Entity\User;
14
use SocialConnect\Common\Hydrator\ObjectMap;
15
16
/**
17
 * @link https://apiok.ru/dev
18
 */
19
class Odnoklassniki extends \SocialConnect\OAuth2\AbstractProvider
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24 2
    public function getBaseUri()
25
    {
26 2
        return 'https://api.ok.ru/api/';
27
    }
28
29
    /**
30
     * {@inheritdoc}
31
     */
32 2
    public function getAuthorizeUri()
33
    {
34 2
        return 'http://connect.ok.ru/oauth/authorize';
35
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 2
    public function getRequestTokenUri()
41
    {
42 2
        return 'http://api.odnoklassniki.ru/oauth/token.do';
43
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 3
    public function getName()
49
    {
50 3
        return 'odnoklassniki';
51
    }
52
53
    /**
54
     * {@inheritdoc}
55
     */
56
    public function parseToken($body)
57
    {
58
        if (empty($body)) {
59
            throw new InvalidAccessToken('Provider response with empty body');
60
        }
61
62
        $result = json_decode($body, true);
63
        if ($result) {
64
            return new AccessToken($result);
65
        }
66
67
        throw new InvalidAccessToken('Provider response with not valid JSON');
68
    }
69
70
    /**
71
     * @link https://apiok.ru/dev/methods/
72
     *
73
     * @param array $requestParameters
74
     * @param AccessTokenInterface $accessToken
75
     * @return string
76
     */
77 1
    protected function makeSecureSignature(array $requestParameters, AccessTokenInterface $accessToken)
78
    {
79 1
        ksort($requestParameters);
80
81 1
        $params = '';
82
83 1
        foreach ($requestParameters as $key => $value) {
84 1
            if ($key === 'access_token') {
85 1
                continue;
86
            }
87
88 1
            $params .= "$key=$value";
89 1
        }
90
91 1
        return strtolower(md5($params . md5($accessToken->getToken() . $this->consumer->getSecret())));
92
    }
93
94
    /**
95
     * {@inheritdoc}
96
     */
97 1
    public function getIdentity(AccessTokenInterface $accessToken)
98
    {
99
        $parameters = [
100 1
            'application_key' => $this->consumer->getPublic(),
101 1
            'access_token' => $accessToken->getToken(),
102
            'format' => 'json'
103 1
        ];
104
105 1
        $parameters['sig'] = $this->makeSecureSignature($parameters, $accessToken);
106
107 1
        $response = $this->httpClient->request(
108 1
            $this->getBaseUri() . 'users/getCurrentUser',
109
            $parameters
110 1
        );
111
112 1
        if (!$response->isSuccess()) {
113 1
            throw new InvalidResponse(
114 1
                'API response with error code',
115
                $response
116 1
            );
117
        }
118
119
        $result = $response->json();
120
        if (!$result) {
121
            throw new InvalidResponse(
122
                'API response is not a valid JSON object',
123
                $response->getBody()
124
            );
125
        }
126
127
        $hydrator = new ObjectMap(
128
            [
129
                'uid' => 'id',
130
                'first_name' => 'firstname',
131
                'last_name' => 'lastname',
132
                'name' => 'fullname'
133
            ]
134
        );
135
136
        return $hydrator->hydrate(new User(), $result);
137
    }
138
}
139