Oauth   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 142
Duplicated Lines 0 %

Importance

Changes 6
Bugs 0 Features 0
Metric Value
eloc 55
dl 0
loc 142
rs 10
c 6
b 0
f 0
wmc 15

5 Methods

Rating   Name   Duplication   Size   Complexity  
A saveToken() 0 13 1
A getOauthProvider() 0 25 5
A getRedirectUri() 0 14 2
A deleteToken() 0 5 1
B getToken() 0 39 6
1
<?php
2
/**
3
 * @link      https://dukt.net/facebook/
4
 * @copyright Copyright (c) Dukt
5
 * @license   https://github.com/dukt/facebook/blob/master/LICENSE.md
6
 */
7
8
namespace dukt\facebook\services;
9
10
use craft\helpers\Json;
11
use craft\helpers\UrlHelper;
12
use dukt\facebook\Plugin as Facebook;
13
use League\OAuth2\Client\Provider\Facebook as FacebookProvider;
14
use yii\base\Component;
15
use League\OAuth2\Client\Token\AccessToken;
16
17
/**
18
 * Class Oauth service
19
 *
20
 * @author Dukt <[email protected]>
21
 * @since  2.0
22
 */
23
class Oauth extends Component
24
{
25
    // Properties
26
    // =========================================================================
27
28
    /**
29
     * @var
30
     */
31
    private $token;
32
33
    // Public Methods
34
    // =========================================================================
35
36
    /**
37
     * Gets the Facebook OAuth provider
38
     *
39
     * @return FacebookProvider
40
     */
41
    public function getOauthProvider()
42
    {
43
        $options = [];
44
45
        $clientId = Facebook::$plugin->getClientId();
46
47
        if ($clientId) {
48
            $options['clientId'] = $clientId;
49
        }
50
51
        $clientSecret = Facebook::$plugin->getClientSecret();
52
53
        if ($clientSecret) {
54
            $options['clientSecret'] = $clientSecret;
55
        }
56
57
        if (!isset($options['graphApiVersion'])) {
58
            $options['graphApiVersion'] = Facebook::$plugin->getSettings()->apiVersion;
59
        }
60
61
        if (!isset($options['redirectUri'])) {
62
            $options['redirectUri'] = $this->getRedirectUri();
63
        }
64
65
        return new FacebookProvider($options);
66
    }
67
68
    /**
69
     * Saves a token
70
     *
71
     * @param AccessToken $token
72
     */
73
    public function saveToken(AccessToken $token)
74
    {
75
        $account = Facebook::$plugin->getAccounts()->getAccount();
76
77
        $account->token = [
78
            'accessToken' => $token->getToken(),
79
            'expires' => $token->getExpires(),
80
            'refreshToken' => $token->getRefreshToken(),
81
            'resourceOwnerId' => $token->getResourceOwnerId(),
82
            'values' => $token->getValues(),
83
        ];;
84
85
        return Facebook::$plugin->getAccounts()->saveAccount($account);
86
    }
87
88
    /**
89
     * Gets a token
90
     *
91
     * @return AccessToken|null
92
     */
93
    public function getToken()
94
    {
95
        if ($this->token) {
96
            return $this->token;
97
        }
98
99
        $account = Facebook::$plugin->getAccounts()->getAccount();
100
101
        if (!$account || !$account->token) {
0 ignored issues
show
introduced by
$account is of type dukt\facebook\models\Account, thus it always evaluated to true.
Loading history...
102
            return null;
103
        }
104
105
        $accountToken = Json::decode($account->token);
106
107
        $token = new AccessToken([
108
            'access_token' => ($accountToken['accessToken'] ?? null),
109
            'expires' => ($accountToken['expires'] ?? null),
110
            'refresh_token' => ($accountToken['refreshToken'] ?? null),
111
            'resource_owner_id' => ($accountToken['resourceOwnerId'] ?? null),
112
            'values' => ($accountToken['values'] ?? null),
113
        ]);
114
115
        if ($token->getExpires() && $token->hasExpired()) {
116
            $provider = $this->getOauthProvider();
117
            $grant = new \League\OAuth2\Client\Grant\RefreshToken();
118
            $newToken = $provider->getAccessToken($grant, ['refresh_token' => $token->getRefreshToken()]);
119
120
            $token = new AccessToken([
121
                'access_token' => $newToken->getToken(),
122
                'expires' => $newToken->getExpires(),
123
                'refresh_token' => $accountToken['refreshToken'],
124
                'resource_owner_id' => $newToken->getResourceOwnerId(),
125
                'values' => $newToken->getValues(),
126
            ]);
127
128
            $this->saveToken($token);
129
        }
130
131
        return $token;
132
    }
133
134
    /**
135
     * Deletes a token
136
     *
137
     * @return bool
138
     */
139
    public function deleteToken()
140
    {
141
        $account = Facebook::$plugin->getAccounts()->getAccount();
142
143
        return Facebook::$plugin->getAccounts()->deleteAccount($account);
144
    }
145
146
    /**
147
     * Gets the redirect URI.
148
     *
149
     * @return string
150
     */
151
    public function getRedirectUri()
152
    {
153
        $url = UrlHelper::actionUrl('facebook/oauth/callback');
154
        $parsedUrl = parse_url($url);
155
156
        if (isset($parsedUrl['query'])) {
157
            parse_str($parsedUrl['query'], $query);
158
159
            $query = http_build_query($query);
160
161
            return $parsedUrl['scheme'].'://'.$parsedUrl['host'].$parsedUrl['path'].'?'.$query;
162
        }
163
164
        return $url;
165
    }
166
}
167