1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
liveidoauth.php
См. документацию.
1<?
2
5
7
9{
10 const ID = "LiveIDOAuth";
11 const CONTROLLER_URL = "https://www.bitrix24.ru/controller";
12
14 protected $entityOAuth = null;
15
16 public function getEntityOAuth()
17 {
18 if (!$this->entityOAuth)
19 {
20 $this->entityOAuth = new CLiveIDOAuthInterface();
21 }
22
23 return $this->entityOAuth;
24 }
25
26 public function GetSettings()
27 {
28 return array(
29 array("liveid_appid", GetMessage("socserv_liveid_client_id"), "", Array("text", 40)),
30 array("liveid_appsecret", GetMessage("socserv_liveid_client_secret"), "", Array("text", 40)),
31 array(
32 'note' => getMessage(
33 'socserv_liveid_form_note_3',
34 array(
35 '#URL#' => \CHttp::urn2uri('/bitrix/tools/oauth/liveid.php'),
36 '#MAIL_URL#' => \CHttp::urn2uri('/bitrix/tools/mail_oauth.php'),
37 )
38 ),
39 ),
40 );
41 }
42
43 public function GetFormHtml($arParams)
44 {
45 $url = $this->getUrl('opener', null, $arParams);
46 if($arParams["FOR_INTRANET"])
47 return array("ON_CLICK" => 'onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)"');
48 return '<a href="javascript:void(0)" onclick="BX.util.popup(\''.htmlspecialcharsbx(CUtil::JSEscape($url)).'\', 580, 400)" class="bx-ss-button liveid-button"></a><span class="bx-spacer"></span><span>'.GetMessage("MAIN_OPTION_COMMENT").'</span>';
49 }
50
51 public function GetOnClickJs($arParams)
52 {
53 $url = $this->getUrl('opener', null, $arParams);
54 return "BX.util.popup('".CUtil::JSEscape($url)."', 580, 400)";
55 }
56
57 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
58 {
59 global $APPLICATION;
60
61 if ($this->userId == null)
62 {
63 $this->getEntityOAuth()->setRefreshToken("skip");
64 }
65 if ($addScope !== null)
66 {
67 $this->getEntityOAuth()->addScope($addScope);
68 }
69
70 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
71 {
72 $redirect_uri = self::CONTROLLER_URL."/redirect.php";
73 $state = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php")."?state=";
74 $backurl = urlencode($GLOBALS["APPLICATION"]->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), array("logout", "auth_service_error", "auth_service_id", "backurl"))).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '').'&mode='.$location;
75 $state .= urlencode(urlencode("backurl=".$backurl));
76 }
77 else
78 {
79 $backurl = $APPLICATION->GetCurPageParam(
80 'check_key='.\CSocServAuthManager::getUniqueKey(),
81 array("logout", "auth_service_error", "auth_service_id", "backurl")
82 );
83
84 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php");
85 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($backurl).(isset($arParams['BACKURL']) ? '&redirect_url='.urlencode($arParams['BACKURL']) : '').'&mode='.$location;
86 }
87
88 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
89 }
90
91 public function getStorageToken()
92 {
93 $accessToken = null;
94 $userId = intval($this->userId);
95 if($userId > 0)
96 {
97 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
98 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID" => "LiveIDOAuth"],
99 'select' => ["OATOKEN", "REFRESH_TOKEN", "OATOKEN_EXPIRES"]
100 ]);
101 if($arOauth = $dbSocservUser->fetch())
102 {
103 $accessToken = $arOauth["OATOKEN"];
104
105 if(empty($accessToken) || ((intval($arOauth["OATOKEN_EXPIRES"]) > 0) && (intval($arOauth["OATOKEN_EXPIRES"] < intval(time())))))
106 {
107 if(isset($arOauth['REFRESH_TOKEN']))
108 $this->entityOAuth->getNewAccessToken($arOauth['REFRESH_TOKEN'], $userId, true);
109 if(($accessToken = $this->entityOAuth->getToken()) === false)
110 return null;
111 }
112 }
113 }
114
115 return $accessToken;
116 }
117
118 public function Authorize()
119 {
120 global $APPLICATION;
121
122 $APPLICATION->RestartBuffer();
123
124 $bProcessState = false;
125 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
126
127 if(isset($_REQUEST["code"]) && $_REQUEST["code"] != '' && CSocServAuthManager::CheckUniqueKey())
128 {
129 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
130 $redirect_uri = self::CONTROLLER_URL."/redirect.php";
131 else
132 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php");
133
134 $appID = trim(self::GetOption("liveid_appid"));
135 $appSecret = trim(self::GetOption("liveid_appsecret"));
136
137 $gAuth = new CLiveIDOAuthInterface($appID, $appSecret, $_REQUEST["code"]);
138
139 $bProcessState = true;
140
141 if($gAuth->GetAccessToken($redirect_uri) !== false)
142 {
143
144 $arLiveIDUser = $gAuth->GetCurrentUser();
145 if(is_array($arLiveIDUser) && ($arLiveIDUser['id'] <> ''))
146 {
147 $email = $first_name = $last_name = "";
148 $login = "LiveID".$arLiveIDUser['id'];
149 $uId = $arLiveIDUser['id'];
150 if($arLiveIDUser['first_name'] <> '')
151 $first_name = $arLiveIDUser['first_name'];
152 if($arLiveIDUser['last_name'] <> '')
153 $last_name = $arLiveIDUser['last_name'];
154 if($arLiveIDUser['emails']['preferred'] <> '')
155 {
156 $email = $arLiveIDUser['emails']['preferred'];
157 $login = $arLiveIDUser['emails']['preferred'];
158 $uId = $arLiveIDUser['emails']['preferred'];
159 }
160 $arFields = array(
161 'EXTERNAL_AUTH_ID' => self::ID,
162 'XML_ID' => $uId,
163 'LOGIN' => $login,
164 'EMAIL' => $email,
165 'NAME'=> $first_name,
166 'LAST_NAME'=> $last_name,
167 );
168 $arFields["PERSONAL_WWW"] = $arLiveIDUser["link"];
169 if(isset($arLiveIDUser['access_token']))
170 $arFields["OATOKEN"] = $arLiveIDUser['access_token'];
171
172 if(isset($arLiveIDUser['refresh_token']))
173 $arFields["REFRESH_TOKEN"] = $arLiveIDUser['refresh_token'];
174
175 if(isset($arLiveIDUser['expires_in']))
176 $arFields["OATOKEN_EXPIRES"] = time() + $arLiveIDUser['expires_in'];
177 if(SITE_ID <> '')
178 $arFields["SITE_ID"] = SITE_ID;
179 $bSuccess = $this->AuthorizeUser($arFields);
180
181 }
182 }
183 }
184
185 if(!$bProcessState)
186 {
187 unset($_REQUEST["state"]);
188 }
189
190 $url = ($APPLICATION->GetCurDir() == "/login/") ? "" : $APPLICATION->GetCurDir();
191 $aRemove = array("logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset");
192
193 $mode = 'opener';
194 $addParams = true;
195 if(isset($_REQUEST["state"]))
196 {
197 $arState = array();
198 parse_str($_REQUEST["state"], $arState);
199 if(isset($arState['backurl']) || isset($arState['redirect_url']))
200 {
201 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
202 if(mb_substr($url, 0, 1) !== "#")
203 {
204 $parseUrl = parse_url($url);
205 $urlPath = $parseUrl["path"];
206 $arUrlQuery = explode('&', $parseUrl["query"]);
207
208 foreach($arUrlQuery as $key => $value)
209 {
210 foreach($aRemove as $param)
211 {
212 if(mb_strpos($value, $param."=") === 0)
213 {
214 unset($arUrlQuery[$key]);
215 break;
216 }
217 }
218 }
219
220 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
221 }
222 else
223 {
224 $addParams = false;
225 }
226 }
227
228 if(isset($arState['mode']))
229 {
230 $mode = $arState['mode'];
231 }
232 }
233
234 if($bSuccess === SOCSERV_REGISTRATION_DENY)
235 {
236 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
237 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
238 }
239 elseif($bSuccess !== true)
240 {
241 $url = (isset($parseUrl))
242 ? $urlPath.'?auth_service_id='.self::ID.'&auth_service_error='.$bSuccess
243 : $APPLICATION->GetCurPageParam(('auth_service_id='.self::ID.'&auth_service_error='.$bSuccess), $aRemove);
244 }
245
246 if($addParams && CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
247 $url = (preg_match("/\?/", $url)) ? $url."&current_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
248
249 $url = CUtil::JSEscape($url);
250
251 if($addParams)
252 {
253 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
254 }
255 else
256 {
257 //fix for chrome
258 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + \''.$url.'\'; window.close();' : ' window.location = window.location.href + \''.$url.'\';';
259 }
260
261 $JSScript = '
262 <script>
263 '.$location.'
264 </script>
265 ';
266
267 echo $JSScript;
268
269 CMain::FinalActions();
270 }
271
272 public function getFriendsList($limit = 0, $offset = 0)
273 {
274 $li = new CLiveIDOAuthInterface();
275
276 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
277 {
278 $redirect_uri = self::CONTROLLER_URL."/redirect.php";
279 }
280 else
281 {
282 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php");
283 }
284
285 if($li->GetAccessToken($redirect_uri) !== false)
286 {
287 $res = $li->GetCurrentUserFriends($limit, $offset);
288 }
289
290 if(is_array($res) && is_array($res['data']))
291 {
292 foreach($res['data'] as $key => $contact)
293 {
294 $res['data'][$key]['uid'] = $contact['id'];
295 $res['data'][$key]['url'] = $this->getProfileUrl($contact['id']);
296 }
297 return $res['data'];
298 }
299
300 return false;
301 }
302
303 public function getProfileUrl($id)
304 {
305 return 'https://people.live.com/';
306 }
307}
308
309class CLiveIDOAuthInterface
310{
311 const SERVICE_ID = "LiveIDOAuth";
312
313 const AUTH_URL = "https://login.live.com/oauth20_authorize.srf";
314 const TOKEN_URL = "https://login.live.com/oauth20_token.srf";
315 const CONTACTS_URL = "https://apis.live.net/v5.0/me/";
316 const FRIENDS_URL = "https://apis.live.net/v5.0/me/contacts/";
317
318 protected $appID;
319 protected $appSecret;
320 protected $code = false;
321 protected $access_token = false;
322 protected $accessTokenExpires = 0;
323 protected $refresh_token = '';
324 protected $scope = array(
325 'wl.signin',
326 'wl.basic',
327 'wl.offline_access',
328 'wl.emails',
329 );
330
331 public function __construct($appID = false, $appSecret = false, $code=false)
332 {
333 if($appID === false)
334 {
335 $appID = trim(CSocServLiveIDOAuth::GetOption("liveid_appid"));
336 }
337
338 if($appSecret === false)
339 {
340 $appSecret = trim(CSocServLiveIDOAuth::GetOption("liveid_appsecret"));
341 }
342
343 $this->httpTimeout = SOCSERV_DEFAULT_HTTP_TIMEOUT;
344 $this->appID = $appID;
345 $this->appSecret = $appSecret;
346 $this->code = $code;
347 }
348
349 public function getAccessTokenExpires()
350 {
351 return $this->accessTokenExpires;
352 }
353
354 public function getAppID()
355 {
356 return $this->appID;
357 }
358
359 public function getAppSecret()
360 {
361 return $this->appSecret;
362 }
363
364 public function getToken()
365 {
366 return $this->access_token;
367 }
368
373 {
374 $this->refresh_token = $refresh_token;
375 }
376
377 public function setScope($scope)
378 {
379 $this->scope = $scope;
380 }
381
382 public function getScope()
383 {
384 return $this->scope;
385 }
386
387 public function addScope($scope)
388 {
389 if(is_array($scope))
390 $this->scope = array_merge($this->scope, $scope);
391 else
392 $this->scope[] = $scope;
393 return $this;
394 }
395
396 public function getScopeEncode()
397 {
398 return implode('+', array_map('urlencode', array_unique($this->getScope())));
399 }
400
401 public function GetAuthUrl($redirect_uri, $state='')
402 {
403 return self::AUTH_URL.
404 "?client_id=".urlencode($this->appID).
405 "&redirect_uri=".urlencode($redirect_uri).
406 "&scope=".$this->getScopeEncode().
407 "&response_type=code".
408 ($state <> ''? '&state='.urlencode($state):'');
409 }
410
411 public function GetAccessToken($redirect_uri)
412 {
413 $tokens = $this->getStorageTokens();
414
415 if(is_array($tokens))
416 {
417 $this->access_token = $tokens["OATOKEN"];
418 $this->accessTokenExpires = $tokens["OATOKEN_EXPIRES"];
419
420 if(!$this->code)
421 {
422 if($this->checkAccessToken())
423 {
424 return true;
425 }
426 elseif(isset($tokens["REFRESH_TOKEN"]))
427 {
428 if($this->getNewAccessToken($tokens["REFRESH_TOKEN"]))
429 {
430 return true;
431 }
432 }
433 }
434
435 $this->deleteStorageTokens();
436 }
437
438 if($this->code === false)
439 {
440 return false;
441 }
442
443 $result = CHTTP::sPostHeader(self::TOKEN_URL, array(
444 "code"=>$this->code,
445 "client_id"=>$this->appID,
446 "client_secret"=>$this->appSecret,
447 "redirect_uri"=>$redirect_uri,
448 "grant_type"=>"authorization_code",
449 ), array(), $this->httpTimeout);
450
451 $arResult = CUtil::JsObjectToPhp($result);
452
453 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
454 {
455 $this->access_token = $arResult["access_token"];
456 $this->accessTokenExpires = $arResult["expires_in"];
457 if(isset($arResult["refresh_token"]) && $arResult["refresh_token"] <> '')
458 {
459 $this->refresh_token = $arResult["refresh_token"];
460 }
461 $_SESSION["OAUTH_DATA"] = array("OATOKEN" => $this->access_token);
462 return true;
463 }
464 return false;
465 }
466
467 public function GetCurrentUser()
468 {
469 if($this->access_token === false)
470 return false;
471
472 $result = CHTTP::sGetHeader(self::CONTACTS_URL."?access_token=".urlencode($this->access_token), array(), $this->httpTimeout);
473
474 $result = CUtil::JsObjectToPhp($result);
475
476 if(is_array($result))
477 {
478 $result["access_token"] = $this->access_token;
479 $result["refresh_token"] = $this->refresh_token;
480 $result["expires_in"] = $this->accessTokenExpires;
481 }
482 return $result;
483 }
484
485 public function GetCurrentUserFriends($limit = 0, $offset = 0)
486 {
487 if($this->access_token === false)
488 return false;
489
490 $url = self::FRIENDS_URL."?access_token=".urlencode($this->access_token);
491
492 if($limit > 0)
493 {
494 $url .= '&limit='.intval($limit)."&offset=".intval($offset);
495 }
496
497 $result = CHTTP::sGetHeader($url, array(), $this->httpTimeout);
498
499 $result = CUtil::JsObjectToPhp($result);
500
501 if(is_array($result))
502 {
503 $result["access_token"] = $this->access_token;
504 $result["refresh_token"] = $this->refresh_token;
505 $result["expires_in"] = $this->accessTokenExpires;
506 }
507 return $result;
508 }
509
510 private function getStorageTokens()
511 {
512 global $USER;
513
514 if(is_object($USER))
515 {
516 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
517 'filter' => ['=USER_ID' => $USER->GetID(), "=EXTERNAL_AUTH_ID" => CSocServLiveIDOAuth::ID],
518 'select' => ["USER_ID", "OATOKEN", "OATOKEN_EXPIRES", "REFRESH_TOKEN"]
519 ]);
520 return $dbSocservUser->fetch();
521 }
522
523 return false;
524 }
525
526 private function checkAccessToken()
527 {
528 return (($this->access_token - 30) < time()) ? false : true;
529 }
530
531 public function getNewAccessToken($refreshToken, $userId = 0, $save = false)
532 {
533 if($this->appID == false || $this->appSecret == false)
534 return false;
535
536 $result = CHTTP::sPostHeader(self::TOKEN_URL, array(
537 "refresh_token"=>$refreshToken,
538 "client_id"=>$this->appID,
539 "client_secret"=>$this->appSecret,
540 "grant_type"=>"refresh_token",
541 ), array(), $this->httpTimeout);
542
543 try
544 {
545 $arResult = Json::decode($result);
546 }
547 catch (ArgumentException)
548 {
549 return false;
550 }
551
552 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
553 {
554 $this->access_token = $arResult["access_token"];
555 $this->accessTokenExpires = $arResult["expires_in"];
556 if($save && intval($userId) > 0)
557 {
558 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
559 'filter' => [
560 '=USER_ID' => intval($userId),
561 "=EXTERNAL_AUTH_ID" => 'LiveIDOAuth'
562 ],
563 'select' => ["ID"]
564 ]);
565 if($arOauth = $dbSocservUser->fetch())
566 \Bitrix\Socialservices\UserTable::update($arOauth["ID"], array("OATOKEN" => $this->access_token, "OATOKEN_EXPIRES" => time() + $this->accessTokenExpires));
567 }
568 return true;
569 }
570 return false;
571 }
572
573 protected function deleteStorageTokens()
574 {
575 global $USER;
576
577 if(is_object($USER) && $USER->IsAuthorized())
578 {
579 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList(array(
580 'filter' => array(
581 '=USER_ID' => $USER->GetID(),
582 "=EXTERNAL_AUTH_ID" => static::SERVICE_ID
583 ),
584 'select' => array("ID")
585 ));
586
587 while($accessToken = $dbSocservUser->fetch())
588 {
589 \Bitrix\Socialservices\UserTable::delete($accessToken['ID']);
590 }
591 }
592 }
593}
594?>
$arParams
Определения access_dialog.php:21
$arResult
Определения generate_coupon.php:16
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
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
Определения json.php:9
static sGetHeader($url, $arHeader=array(), $httpTimeout=0)
Определения http.php:444
static sPostHeader($url, $arPostData, $arHeader=array(), $http_timeout=0)
Определения http.php:465
getNewAccessToken($refreshToken, $userId=0, $save=false)
Определения liveidoauth.php:531
getScope()
Определения liveidoauth.php:382
__construct($appID=false, $appSecret=false, $code=false)
Определения liveidoauth.php:331
getAppID()
Определения liveidoauth.php:354
const CONTACTS_URL
Определения liveidoauth.php:315
getToken()
Определения liveidoauth.php:364
const TOKEN_URL
Определения liveidoauth.php:314
setScope($scope)
Определения liveidoauth.php:377
GetAccessToken($redirect_uri)
Определения liveidoauth.php:411
GetCurrentUser()
Определения liveidoauth.php:467
const FRIENDS_URL
Определения liveidoauth.php:316
getScopeEncode()
Определения liveidoauth.php:396
addScope($scope)
Определения liveidoauth.php:387
deleteStorageTokens()
Определения liveidoauth.php:573
GetAuthUrl($redirect_uri, $state='')
Определения liveidoauth.php:401
$accessTokenExpires
Определения liveidoauth.php:322
GetCurrentUserFriends($limit=0, $offset=0)
Определения liveidoauth.php:485
$access_token
Определения liveidoauth.php:321
setRefreshToken($refresh_token)
Определения liveidoauth.php:372
$refresh_token
Определения liveidoauth.php:323
getAccessTokenExpires()
Определения liveidoauth.php:349
getAppSecret()
Определения liveidoauth.php:359
Определения authmanager.php:985
static GetOption($opt)
Определения authmanager.php:1339
const ID
Определения liveidoauth.php:10
GetSettings()
Определения liveidoauth.php:26
$entityOAuth
Определения liveidoauth.php:14
getEntityOAuth()
Определения liveidoauth.php:16
const CONTROLLER_URL
Определения liveidoauth.php:11
getUrl($location='opener', $addScope=null, $arParams=array())
Определения liveidoauth.php:57
GetFormHtml($arParams)
Определения liveidoauth.php:43
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$save
Определения iblock_catalog_edit.php:365
global $USER
Определения csv_new_run.php:40
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
return false
Определения prolog_main_admin.php:185
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
const SOCSERV_DEFAULT_HTTP_TIMEOUT
Определения include.php:5
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7