1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
yandex.php
См. документацию.
1<?
3
5{
6 const ID = "YandexOAuth";
7 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
8 const LOGIN_PREFIX = "YA_";
9
11 protected $entityOAuth = null;
12
17 public function getEntityOAuth($code = false)
18 {
19 if(!$this->entityOAuth)
20 {
21 $this->entityOAuth = new CYandexOAuthInterface();
22 }
23
24 if($code !== false)
25 {
26 $this->entityOAuth->setCode($code);
27 }
28
29 return $this->entityOAuth;
30 }
31
32 public function GetSettings()
33 {
34 return array(
35 array("yandex_appid", GetMessage("socserv_yandex_client_id"), "", array("text", 40)),
36 array("yandex_appsecret", GetMessage("socserv_yandex_client_secret"), "", array("text", 40)),
37 array(
38 'note' => getMessage(
39 'socserv_yandex_note_2',
40 array(
41 '#URL#' => \CYandexOAuthInterface::getRedirectUri(),
42 '#MAIL_URL#' => \CHttp::urn2uri('/bitrix/tools/mail_oauth.php'),
43 )
44 ),
45 ),
46 );
47 }
48
49 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
50 {
51 global $APPLICATION;
52
53 $this->entityOAuth = $this->getEntityOAuth();
54 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
55 {
56 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
57 $state = CYandexOAuthInterface::GetRedirectURI()."?check_key=".\CSocServAuthManager::getUniqueKey()."&state=";
58 $backurl = $APPLICATION->GetCurPageParam('', array("logout", "auth_service_error", "auth_service_id", "backurl"));
59 $state .= urlencode("state=".urlencode("backurl=".urlencode($backurl).'&mode='.$location.(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '')));
60 }
61 else
62 {
63 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($APPLICATION->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).'&mode='.$location.(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '');
65 }
66
67 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state);
68 }
69
70 public function GetFormHtml($arParams)
71 {
72 $url = static::getUrl('opener', null, $arParams);
73
74 $phrase = ($arParams["FOR_INTRANET"]) ? GetMessage("socserv_yandex_form_note_intranet") : GetMessage("socserv_yandex_form_note");
75
76 if($arParams["FOR_INTRANET"])
77 {
78 return array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)"');
79 }
80 else
81 {
82 return '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 680, 600)" class="bx-ss-button yandex-button"></a><span class="bx-spacer"></span><span>'.$phrase.'</span>';
83 }
84 }
85
86 public function GetOnClickJs($arParams)
87 {
88 $url = static::getUrl('opener', null, $arParams);
89 return "BX.util.popup('".CUtil::JSEscape($url)."', 680, 600)";
90 }
91
92 public function getStorageToken()
93 {
94 $accessToken = null;
95 $userId = intval($this->userId);
96 if($userId > 0)
97 {
98 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
99 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID" => static::ID],
100 'select' => ["OATOKEN", "REFRESH_TOKEN", "OATOKEN_EXPIRES"]
101 ]);
102 if($arOauth = $dbSocservUser->fetch())
103 {
104 $accessToken = $arOauth["OATOKEN"];
105 }
106 }
107
108 return $accessToken;
109 }
110
111 public function prepareUser($yandexUser, $short = false)
112 {
113 $id = $yandexUser['id'];
114
115 $userFields = array(
116 'EXTERNAL_AUTH_ID' => static::ID,
117 'XML_ID' => $id,
118 'LOGIN' => static::LOGIN_PREFIX.$id,
119 'NAME'=> $yandexUser['first_name'],
120 'LAST_NAME'=> $yandexUser['last_name'],
121 'OATOKEN' => $this->entityOAuth->getToken(),
122 'OATOKEN_EXPIRES' => $this->entityOAuth->getAccessTokenExpires(),
123 );
124
125 if($userFields["NAME"] == '')
126 {
127 $userFields["NAME"] = $yandexUser["login"];
128 }
129
130 if(isset($yandexUser["emails"]) && is_array($yandexUser["emails"]) && count($yandexUser["emails"]) > 0)
131 {
132 $userFields["EMAIL"] = $yandexUser['emails'][0];
133 }
134
135 if(!$short && !empty($yandexUser['default_avatar_id']))
136 {
137 $picture_url = "https://avatars.yandex.net/get-yapic/".$yandexUser["default_avatar_id"]."/islands-200";
138
139 $temp_path = CFile::GetTempName('', 'picture.jpg');
140
141 $ob = new \Bitrix\Main\Web\HttpClient(array(
142 "redirect" => true
143 ));
144 $ob->download($picture_url, $temp_path);
145
146 $arPic = CFile::MakeFileArray($temp_path);
147 if($arPic)
148 {
149 $userFields["PERSONAL_PHOTO"] = $arPic;
150 }
151 }
152
153 if(SITE_ID <> '')
154 {
155 $userFields["SITE_ID"] = SITE_ID;
156 }
157
158 return $userFields;
159 }
160
161 public function Authorize()
162 {
163 global $APPLICATION;
164 $APPLICATION->RestartBuffer();
165
166 $bSuccess = false;
167 $bProcessState = false;
168 $authError = SOCSERV_AUTHORISATION_ERROR;
169
170 if(
171 isset($_REQUEST["code"]) && $_REQUEST["code"] <> '' && CSocServAuthManager::CheckUniqueKey()
172 )
173 {
174 $bProcessState = true;
175 $this->entityOAuth = $this->getEntityOAuth($_REQUEST['code']);
176
177 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
178 {
179 $redirect_uri = static::CONTROLLER_URL."/redirect.php";
180 }
181 else
182 {
183 $redirect_uri = $this->getEntityOAuth()->GetRedirectURI();
184 }
185
186 if($this->entityOAuth->GetAccessToken($redirect_uri) !== false)
187 {
188 $boxUser = $this->entityOAuth->GetCurrentUser();
189
190 if(is_array($boxUser))
191 {
192 $arFields = self::prepareUser($boxUser);
193 $authError = $this->AuthorizeUser($arFields);
194 $bSuccess = $authError === true;
195 }
196 }
197 }
198
199 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
200 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
201
202 if(!$bProcessState)
203 {
204 unset($_REQUEST["state"]);
205 }
206
207 $mode = 'opener';
208 $addParams = true;
209 if(isset($_REQUEST["state"]))
210 {
211 $arState = array();
212 parse_str($_REQUEST["state"], $arState);
213
214 if(isset($arState['backurl']) || isset($arState['redirect_url']))
215 {
216 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
217 if(mb_substr($url, 0, 1) !== "#")
218 {
219 $parseUrl = parse_url($url);
220
221 $urlPath = $parseUrl["path"];
222 $arUrlQuery = explode('&', $parseUrl["query"]);
223
224 foreach($arUrlQuery as $key => $value)
225 {
226 foreach($aRemove as $param)
227 {
228 if(mb_strpos($value, $param."=") === 0)
229 {
230 unset($arUrlQuery[$key]);
231 break;
232 }
233 }
234 }
235
236 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
237 }
238 else
239 {
240 $addParams = false;
241 }
242 }
243
244 if(isset($arState['mode']))
245 {
246 $mode = $arState['mode'];
247 }
248 }
249
250 if($authError === SOCSERV_REGISTRATION_DENY)
251 {
252 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
253 $url .= 'auth_service_id='.static::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
254 }
255 elseif($bSuccess !== true)
256 {
257 $url = (isset($urlPath)) ? $urlPath.'?auth_service_id='.static::ID.'&auth_service_error='.$authError : $APPLICATION->GetCurPageParam(('auth_service_id='.static::ID.'&auth_service_error='.$authError), $aRemove);
258 }
259
260 if($addParams && CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
261 {
262 $url = (preg_match("/\?/", $url)) ? $url."&current_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
263 }
264
265 $url = CUtil::JSEscape($url);
266
267 if($addParams)
268 {
269 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
270 }
271 else
272 {
273 //fix for chrome
274 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + \''.$url.'\'; window.close();' : ' window.location = window.location.href + \''.$url.'\';';
275 }
276
277 $JSScript = '
278 <script>
279 '.$location.'
280 </script>
281 ';
282
283 echo $JSScript;
284
285 CMain::FinalActions();
286 }
287}
288
289class CYandexOAuthInterface extends CSocServOAuthTransport
290{
291 const SERVICE_ID = "YandexOAuth";
292
293 const AUTH_URL = "https://oauth.yandex.ru/authorize";
294 const TOKEN_URL = "https://oauth.yandex.ru/token";
295
296 const USERINFO_URL = "https://login.yandex.ru/info";
297
298 const MAX_DEVICE_ID_LENGTH = 50;
299
300 protected $arResult = array();
301
302 public function __construct($appID = false, $appSecret = false, $code = false)
303 {
304 if($appID === false)
305 {
306 $appID = trim(CSocServYandexAuth::GetOption("yandex_appid"));
307 }
308
309 if($appSecret === false)
310 {
311 $appSecret = trim(CSocServYandexAuth::GetOption("yandex_appsecret"));
312 }
313
314 parent::__construct($appID, $appSecret, $code);
315 }
316
317 public static function GetRedirectURI()
318 {
319 return \CHTTP::URN2URI("/bitrix/tools/oauth/yandex.php");
320 }
321
322 public function getResult()
323 {
324 return $this->arResult;
325 }
326
327 public function getError()
328 {
329 return is_array($this->arResult) && isset($this->arResult['error'])
330 ? $this->arResult['error']
331 : '';
332 }
333
339 public function GetAuthUrl($redirect_uri = '', $state = '')
340 {
341 $deviceId = $this->getDeviceId($state);
342
343 return self::AUTH_URL
344 ."?response_type=code"
345 ."&client_id=".urlencode($this->appID)
346 .(!empty($deviceId) ? "&device_id=".$deviceId : '')
347 ."&display=popup"
348 ."&redirect_uri=".urlencode($redirect_uri)
349 .'&force_confirm=yes'
350 .(!empty($state) ? "&state=".urlencode($state) : '');
351 }
352
357 public function getDeviceId($state)
358 {
359 $deviceId = '';
360 if (!empty($state) && isset($_SESSION[$state]))
361 {
362 list(, $deviceId) = $_SESSION[$state];
363 if ($deviceId)
364 {
365 $deviceId = mb_substr($deviceId, 0, self::MAX_DEVICE_ID_LENGTH);
366 }
367 }
368
369 return $deviceId;
370 }
371
372 public function GetAccessToken()
373 {
374 if(($tokens = $this->getStorageTokens()) && is_array($tokens))
375 {
376 $this->access_token = $tokens["OATOKEN"];
377
378 if(!$this->code)
379 {
380 if($this->checkAccessToken())
381 {
382 return true;
383 }
384 }
385
386 $this->deleteStorageTokens();
387 }
388
389 if($this->code === false)
390 {
391 return false;
392 }
393
394 $h = new \Bitrix\Main\Web\HttpClient(array("socketTimeout" => $this->httpTimeout));
395 $h->setAuthorization($this->appID, $this->appSecret);
396
397 $result = $h->post(self::TOKEN_URL, array(
398 "grant_type"=>"authorization_code",
399 "code"=>$this->code,
400 "client_id" => $this->appID,
401 ));
402
403 $this->arResult = \Bitrix\Main\Web\Json::decode($result);
404
405 if(isset($this->arResult["access_token"]) && $this->arResult["access_token"] <> '')
406 {
407 // yandex doesn't send refresh tokens but I leave it here in case they will
408 if(isset($this->arResult["refresh_token"]) && $this->arResult["refresh_token"] <> '')
409 {
410 $this->refresh_token = $this->arResult["refresh_token"];
411 }
412 $this->access_token = $this->arResult["access_token"];
413 $this->accessTokenExpires = $this->arResult["expires_in"] + time();
414
415 $_SESSION["OAUTH_DATA"] = array(
416 "OATOKEN" => $this->access_token,
417 );
418
419 return true;
420 }
421 return false;
422 }
423
424 public function GetCurrentUser()
425 {
426 if($this->access_token === false)
427 return false;
428
429 $h = new \Bitrix\Main\Web\HttpClient();
430 $result = $h->get(self::USERINFO_URL.'?format=json&oauth_token='.urlencode($this->access_token));
431
432 try
433 {
435 }
436 catch(\Bitrix\Main\SystemException $e)
437 {
438 $result = false;
439 }
440
441 if(is_array($result))
442 {
443 $result["access_token"] = $this->access_token;
444 $result["refresh_token"] = $this->refresh_token;
445 $result["expires_in"] = $this->accessTokenExpires;
446 }
447 return $result;
448 }
449
450 public function GetAppInfo()
451 {
452 if ($this->access_token === false)
453 return false;
454
455 $h = new \Bitrix\Main\Web\HttpClient();
456 $h->setTimeout($this->httpTimeout);
457
458 $result = $h->get(self::USERINFO_URL.'?format=json&oauth_token='.urlencode($this->access_token));
459
460 try
461 {
463 $result = array_key_exists("client_id", $result)
464 ? array("id" => $result["client_id"])
465 : array();
466 } catch (\Bitrix\Main\ArgumentException $e)
467 {
468 $result = array();
469 }
470
471 return $result;
472 }
473}
$arParams
Определения access_dialog.php:21
global $APPLICATION
Определения include.php:80
change_password_forgot_link login popup forget pas AUTH_GOTO_FORGOT_FORM login btn wrap change_password_button login popup link login popup return auth javascript
Определения change_password.php:57
static decode($data)
Определения json.php:50
Определения authmanager.php:985
AuthorizeUser($socservUserFields, $bSave=false)
Определения authmanager.php:1395
static CheckUniqueKey($bUnset=true)
Определения authmanager.php:351
Определения yandex.php:5
prepareUser($yandexUser, $short=false)
Определения yandex.php:111
const ID
Определения yandex.php:6
Authorize()
Определения yandex.php:161
GetSettings()
Определения yandex.php:32
$entityOAuth
Определения yandex.php:11
getEntityOAuth($code=false)
Определения yandex.php:17
const CONTROLLER_URL
Определения yandex.php:7
getUrl($location='opener', $addScope=null, $arParams=array())
Определения yandex.php:49
const LOGIN_PREFIX
Определения yandex.php:8
GetFormHtml($arParams)
Определения yandex.php:70
static GetRedirectURI()
Определения yandex.php:317
GetCurrentUser()
Определения yandex.php:424
GetAppInfo()
Определения yandex.php:450
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$result
Определения get_property_values.php:14
const EMAIL
Определения idea_notify.php:6
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$backurl
Определения mail_auth.php:15
IsModuleInstalled($module_id)
Определения tools.php:5301
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
$location
Определения options.php:2729
const SOCSERV_REGISTRATION_DENY
Определения include.php:4
const SOCSERV_AUTHORISATION_ERROR
Определения include.php:3
const SITE_ID
Определения sonet_set_content_view.php:12
$url
Определения iframe.php:7