10 const ID =
"LiveIDOAuth";
18 if (!$this->entityOAuth)
29 array(
"liveid_appid",
GetMessage(
"socserv_liveid_client_id"),
"", Array(
"text", 40)),
30 array(
"liveid_appsecret",
GetMessage(
"socserv_liveid_client_secret"),
"", Array(
"text", 40)),
33 'socserv_liveid_form_note_3',
35 '#URL#' => \CHttp::urn2uri(
'/bitrix/tools/oauth/liveid.php'),
36 '#MAIL_URL#' => \CHttp::urn2uri(
'/bitrix/tools/mail_oauth.php'),
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>';
51 public function GetOnClickJs($arParams)
53 $url = $this->getUrl('opener', null, $arParams);
54 return "BX.util.popup(
'".CUtil::JSEscape($url)."', 580, 400)
";
57 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
61 if ($this->userId == null)
63 $this->getEntityOAuth()->setRefreshToken("skip
");
65 if ($addScope !== null)
67 $this->getEntityOAuth()->addScope($addScope);
70 if (IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
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));
79 $backurl = $APPLICATION->GetCurPageParam(
80 'check_key='.\CSocServAuthManager::getUniqueKey(),
81 array("logout
", "auth_service_error
", "auth_service_id
", "backurl
")
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;
88 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
91 public function getStorageToken()
94 $userId = intval($this->userId);
97 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
98 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID
" => "LiveIDOAuth
"],
99 'select' => ["OATOKEN
", "REFRESH_TOKEN
", "OATOKEN_EXPIRES
"]
101 if($arOauth = $dbSocservUser->fetch())
103 $accessToken = $arOauth["OATOKEN
"];
105 if(empty($accessToken) || ((intval($arOauth["OATOKEN_EXPIRES
"]) > 0) && (intval($arOauth["OATOKEN_EXPIRES
"] < intval(time())))))
107 if(isset($arOauth['REFRESH_TOKEN']))
108 $this->entityOAuth->getNewAccessToken($arOauth['REFRESH_TOKEN'], $userId, true);
109 if(($accessToken = $this->entityOAuth->getToken()) === false)
118 public function Authorize()
122 $APPLICATION->RestartBuffer();
124 $bProcessState = false;
125 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
127 if(isset($_REQUEST["code
"]) && $_REQUEST["code
"] != '' && CSocServAuthManager::CheckUniqueKey())
129 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
130 $redirect_uri = self::CONTROLLER_URL."/redirect.php
";
132 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php
");
134 $appID = trim(self::GetOption("liveid_appid
"));
135 $appSecret = trim(self::GetOption("liveid_appsecret
"));
137 $gAuth = new CLiveIDOAuthInterface($appID, $appSecret, $_REQUEST["code
"]);
139 $bProcessState = true;
141 if($gAuth->GetAccessToken($redirect_uri) !== false)
144 $arLiveIDUser = $gAuth->GetCurrentUser();
145 if(is_array($arLiveIDUser) && ($arLiveIDUser['id'] <> ''))
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'] <> '')
156 $email = $arLiveIDUser['emails']['preferred'];
157 $login = $arLiveIDUser['emails']['preferred'];
158 $uId = $arLiveIDUser['emails']['preferred'];
161 'EXTERNAL_AUTH_ID' => self::ID,
165 'NAME'=> $first_name,
166 'LAST_NAME'=> $last_name,
168 $arFields["PERSONAL_WWW
"] = $arLiveIDUser["link
"];
169 if(isset($arLiveIDUser['access_token']))
170 $arFields["OATOKEN
"] = $arLiveIDUser['access_token'];
172 if(isset($arLiveIDUser['refresh_token']))
173 $arFields["REFRESH_TOKEN
"] = $arLiveIDUser['refresh_token'];
175 if(isset($arLiveIDUser['expires_in']))
176 $arFields["OATOKEN_EXPIRES
"] = time() + $arLiveIDUser['expires_in'];
178 $arFields["SITE_ID"] = SITE_ID;
179 $bSuccess = $this->AuthorizeUser($arFields);
187 unset($_REQUEST["state
"]);
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
");
195 if(isset($_REQUEST["state
"]))
198 parse_str($_REQUEST["state
"], $arState);
199 if(isset($arState['backurl']) || isset($arState['redirect_url']))
201 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
202 if(mb_substr($url, 0, 1) !== "#
")
204 $parseUrl = parse_url($url);
205 $urlPath = $parseUrl["path"];
206 $arUrlQuery = explode('&', $parseUrl["query
"]);
208 foreach($arUrlQuery as $key => $value)
210 foreach($aRemove as $param)
212 if(mb_strpos($value, $param."=
") === 0)
214 unset($arUrlQuery[$key]);
220 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&
", $arUrlQuery) : $urlPath;
228 if(isset($arState['mode']))
230 $mode = $arState['mode'];
234 if($bSuccess === SOCSERV_REGISTRATION_DENY)
236 $url = (preg_match("/\?/
", $url)) ? $url.'&' : $url.'?';
237 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
239 elseif($bSuccess !== true)
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);
246 if($addParams && CModule::IncludeModule("socialnetwork
") && mb_strpos($url, "current_fieldset=
") === false)
247 $url = (preg_match("/\?/
", $url)) ? $url."¤t_fieldset=SOCSERV
" : $url."?current_fieldset=SOCSERV
";
249 $url = CUtil::JSEscape($url);
253 $location = ($mode == "opener
") ? 'if(window.opener) window.opener.location = \''.$url.'\'; window.close();' : ' window.location = \''.$url.'\';';
258 $location = ($mode == "opener
") ? 'if(window.opener) window.opener.location = window.opener.location.href + \''.$url.'\'; window.close();' : ' window.location = window.location.href + \''.$url.'\';';
269 CMain::FinalActions();
272 public function getFriendsList($limit = 0, $offset = 0)
274 $li = new CLiveIDOAuthInterface();
276 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
278 $redirect_uri = self::CONTROLLER_URL."/redirect.php
";
282 $redirect_uri = \CHTTP::URN2URI("/bitrix/tools/oauth/liveid.php
");
285 if($li->GetAccessToken($redirect_uri) !== false)
287 $res = $li->GetCurrentUserFriends($limit, $offset);
290 if(is_array($res) && is_array($res['data']))
292 foreach($res['data'] as $key => $contact)
294 $res['data'][$key]['uid'] = $contact['id'];
295 $res['data'][$key]['url'] = $this->getProfileUrl($contact['id']);
303 public function getProfileUrl($id)
305 return 'https://people.live.com/';
309class CLiveIDOAuthInterface
311 const SERVICE_ID = "LiveIDOAuth
";
313 const AUTH_URL = "https:
314 const TOKEN_URL =
"https://login.live.com/oauth20_token.srf";
351 return $this->accessTokenExpires;
361 return $this->appSecret;
366 return $this->access_token;
390 $this->scope = array_merge($this->scope,
$scope);
398 return implode(
'+', array_map(
'urlencode', array_unique($this->
getScope())));
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):
'');
413 $tokens = $this->getStorageTokens();
415 if(is_array($tokens))
417 $this->access_token = $tokens[
"OATOKEN"];
418 $this->accessTokenExpires = $tokens[
"OATOKEN_EXPIRES"];
422 if($this->checkAccessToken())
426 elseif(isset($tokens[
"REFRESH_TOKEN"]))
438 if($this->code ===
false)
445 "client_id"=>$this->appID,
446 "client_secret"=>$this->appSecret,
447 "redirect_uri"=>$redirect_uri,
448 "grant_type"=>
"authorization_code",
449 ),
array(), $this->httpTimeout);
455 $this->access_token =
$arResult[
"access_token"];
456 $this->accessTokenExpires =
$arResult[
"expires_in"];
459 $this->refresh_token =
$arResult[
"refresh_token"];
461 $_SESSION[
"OAUTH_DATA"] =
array(
"OATOKEN" => $this->access_token);
469 if($this->access_token ===
false)
478 $result[
"access_token"] = $this->access_token;
479 $result[
"refresh_token"] = $this->refresh_token;
480 $result[
"expires_in"] = $this->accessTokenExpires;
487 if($this->access_token ===
false)
490 $url = self::FRIENDS_URL.
"?access_token=".urlencode($this->access_token);
494 $url .=
'&limit='.intval($limit).
"&offset=".intval($offset);
503 $result[
"access_token"] = $this->access_token;
504 $result[
"refresh_token"] = $this->refresh_token;
505 $result[
"expires_in"] = $this->accessTokenExpires;
510 private function getStorageTokens()
516 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
518 'select' => [
"USER_ID",
"OATOKEN",
"OATOKEN_EXPIRES",
"REFRESH_TOKEN"]
520 return $dbSocservUser->fetch();
526 private function checkAccessToken()
528 return (($this->access_token - 30) < time()) ?
false :
true;
533 if($this->appID ==
false || $this->appSecret ==
false)
537 "refresh_token"=>$refreshToken,
538 "client_id"=>$this->appID,
539 "client_secret"=>$this->appSecret,
540 "grant_type"=>
"refresh_token",
541 ),
array(), $this->httpTimeout);
554 $this->access_token =
$arResult[
"access_token"];
555 $this->accessTokenExpires =
$arResult[
"expires_in"];
558 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
561 "=EXTERNAL_AUTH_ID" =>
'LiveIDOAuth'
565 if($arOauth = $dbSocservUser->fetch())
566 \Bitrix\Socialservices\UserTable::update($arOauth[
"ID"],
array(
"OATOKEN" => $this->access_token,
"OATOKEN_EXPIRES" => time() + $this->accessTokenExpires));
579 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList(
array(
581 '=USER_ID' =>
$USER->GetID(),
582 "=EXTERNAL_AUTH_ID" => static::SERVICE_ID
584 'select' =>
array(
"ID")
587 while($accessToken = $dbSocservUser->fetch())
589 \Bitrix\Socialservices\UserTable::delete($accessToken[
'ID']);
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
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static sGetHeader($url, $arHeader=array(), $httpTimeout=0)
static sPostHeader($url, $arPostData, $arHeader=array(), $http_timeout=0)
getNewAccessToken($refreshToken, $userId=0, $save=false)
__construct($appID=false, $appSecret=false, $code=false)
GetAccessToken($redirect_uri)
GetAuthUrl($redirect_uri, $state='')
GetCurrentUserFriends($limit=0, $offset=0)
setRefreshToken($refresh_token)
getUrl($location='opener', $addScope=null, $arParams=array())
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
const SOCSERV_DEFAULT_HTTP_TIMEOUT