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
![]() |
|||
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 |