6 const ID =
"YandexOAuth";
19 if(!$this->entityOAuth)
26 $this->entityOAuth->setCode(
$code);
39 'socserv_yandex_note_2',
41 '#URL#' => \CYandexOAuthInterface::getRedirectUri(),
42 '#MAIL_URL#' => \CHttp::urn2uri(
'/bitrix/tools/mail_oauth.php'),
56 $redirect_uri = static::CONTROLLER_URL.
"/redirect.php";
59 $state .= urlencode(
"state=".urlencode(
"backurl=".urlencode(
$backurl).
'&mode='.
$location.(isset(
$arParams[
'BACKURL']) ?
'&redirect_url='.urlencode(
$arParams[
'BACKURL']) :
'')));
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']) :
'');
67 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state);
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>';
86 public function GetOnClickJs($arParams)
88 $url = static::getUrl('opener', null, $arParams);
89 return "BX.util.popup(
'".CUtil::JSEscape($url)."', 680, 600)
";
92 public function getStorageToken()
95 $userId = intval($this->userId);
98 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
99 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID
" => static::ID],
100 'select' => ["OATOKEN
", "REFRESH_TOKEN
", "OATOKEN_EXPIRES
"]
102 if($arOauth = $dbSocservUser->fetch())
104 $accessToken = $arOauth["OATOKEN
"];
111 public function prepareUser($yandexUser, $short = false)
113 $id = $yandexUser['id'];
116 'EXTERNAL_AUTH_ID' => static::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(),
125 if($userFields["NAME
"] == '')
127 $userFields["NAME
"] = $yandexUser["login
"];
130 if(isset($yandexUser["emails
"]) && is_array($yandexUser["emails
"]) && count($yandexUser["emails
"]) > 0)
132 $userFields["EMAIL"] = $yandexUser['emails'][0];
135 if(!$short && !empty($yandexUser['default_avatar_id']))
137 $picture_url = "https:
139 $temp_path = CFile::GetTempName(
'',
'picture.jpg');
141 $ob = new \Bitrix\Main\Web\HttpClient(
array(
144 $ob->download($picture_url, $temp_path);
146 $arPic = CFile::MakeFileArray($temp_path);
149 $userFields[
"PERSONAL_PHOTO"] = $arPic;
155 $userFields[
"SITE_ID"] =
SITE_ID;
167 $bProcessState =
false;
174 $bProcessState =
true;
179 $redirect_uri = static::CONTROLLER_URL.
"/redirect.php";
186 if($this->entityOAuth->GetAccessToken($redirect_uri) !==
false)
188 $boxUser = $this->entityOAuth->GetCurrentUser();
190 if(is_array($boxUser))
194 $bSuccess = $authError ===
true;
200 $aRemove =
array(
"logout",
"auth_service_error",
"auth_service_id",
"code",
"error_reason",
"error",
"error_description",
"check_key",
"current_fieldset");
214 if(isset($arState[
'backurl']) || isset($arState[
'redirect_url']))
216 $url = !empty($arState[
'redirect_url']) ? $arState[
'redirect_url'] : $arState[
'backurl'];
217 if(mb_substr(
$url, 0, 1) !==
"#")
219 $parseUrl = parse_url(
$url);
221 $urlPath = $parseUrl[
"path"];
222 $arUrlQuery = explode(
'&', $parseUrl[
"query"]);
224 foreach($arUrlQuery as
$key => $value)
226 foreach($aRemove as $param)
228 if(mb_strpos($value, $param.
"=") === 0)
230 unset($arUrlQuery[
$key]);
236 $url = (!empty($arUrlQuery)) ? $urlPath.
'?'.implode(
"&", $arUrlQuery) : $urlPath;
244 if(isset($arState[
'mode']))
246 $mode = $arState[
'mode'];
255 elseif($bSuccess !==
true)
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);
260 if($addParams && CModule::IncludeModule(
"socialnetwork") && mb_strpos(
$url,
"current_fieldset=") ===
false)
262 $url = (preg_match(
"/\?/",
$url)) ?
$url.
"¤t_fieldset=SOCSERV" :
$url.
"?current_fieldset=SOCSERV";
269 $location = ($mode ==
"opener") ?
'if(window.opener) window.opener.location = \''.
$url.
'\'; window.close();
' : ' window.location = \
''.$url.
'\';
';
274 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + \
''.$url.
'\'; window.close();
' : ' window.location = window.location.href + \
''.$url.
'\';
';
285 CMain::FinalActions();
289class CYandexOAuthInterface extends CSocServOAuthTransport
291 const SERVICE_ID = "YandexOAuth";
293 const AUTH_URL = "https://oauth.yandex.ru/authorize";
294 const TOKEN_URL = "https://oauth.yandex.ru/token";
296 const USERINFO_URL = "https://login.yandex.ru/info";
298 const MAX_DEVICE_ID_LENGTH = 50;
300 protected $arResult = array();
302 public function __construct($appID = false, $appSecret = false, $code = false)
306 $appID = trim(CSocServYandexAuth::GetOption("yandex_appid"));
309 if($appSecret === false)
311 $appSecret = trim(CSocServYandexAuth::GetOption("yandex_appsecret"));
314 parent::__construct($appID, $appSecret, $code);
317 public static function GetRedirectURI()
319 return \CHTTP::URN2URI("/bitrix/tools/oauth/yandex.php");
322 public function getResult()
324 return $this->arResult;
327 public function getError()
329 return is_array($this->arResult) && isset($this->arResult['error
'])
330 ? $this->arResult['error
']
339 public function GetAuthUrl($redirect_uri = '
', $state = '')
341 $deviceId = $this->getDeviceId($state);
343 return self::AUTH_URL
344 ."?response_type=code"
345 ."&client_id=".urlencode($this->appID)
346 .(!empty($deviceId) ? "&device_id=".$deviceId : '')
348 ."&redirect_uri=".urlencode($redirect_uri)
349 .'&force_confirm=yes
'
350 .(!empty($state) ? "&state=".urlencode($state) : '');
357 public function getDeviceId($state)
360 if (!empty($state) && isset($_SESSION[$state]))
362 list(, $deviceId) = $_SESSION[$state];
365 $deviceId = mb_substr($deviceId, 0, self::MAX_DEVICE_ID_LENGTH);
372 public function GetAccessToken()
374 if(($tokens = $this->getStorageTokens()) && is_array($tokens))
376 $this->access_token = $tokens["OATOKEN"];
380 if($this->checkAccessToken())
386 $this->deleteStorageTokens();
389 if($this->code === false)
394 $h = new \Bitrix\Main\Web\HttpClient(array("socketTimeout" => $this->httpTimeout));
395 $h->setAuthorization($this->appID, $this->appSecret);
397 $result = $h->post(self::TOKEN_URL, array(
398 "grant_type"=>"authorization_code",
400 "client_id" => $this->appID,
403 $this->arResult = \Bitrix\Main\Web\Json::decode($result);
405 if(isset($this->arResult["access_token"]) && $this->arResult["access_token"] <> '')
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"] <>
'')
410 $this->refresh_token = $this->arResult[
"refresh_token"];
412 $this->access_token = $this->arResult[
"access_token"];
413 $this->accessTokenExpires = $this->arResult[
"expires_in"] + time();
415 $_SESSION[
"OAUTH_DATA"] =
array(
416 "OATOKEN" => $this->access_token,
426 if($this->access_token ===
false)
429 $h = new \Bitrix\Main\Web\HttpClient();
430 $result = $h->get(self::USERINFO_URL.
'?format=json&oauth_token='.urlencode($this->access_token));
436 catch(\
Bitrix\Main\SystemException $e)
443 $result[
"access_token"] = $this->access_token;
444 $result[
"refresh_token"] = $this->refresh_token;
445 $result[
"expires_in"] = $this->accessTokenExpires;
452 if ($this->access_token ===
false)
455 $h = new \Bitrix\Main\Web\HttpClient();
456 $h->setTimeout($this->httpTimeout);
458 $result = $h->get(self::USERINFO_URL.
'?format=json&oauth_token='.urlencode($this->access_token));
466 }
catch (\
Bitrix\Main\ArgumentException $e)
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
AuthorizeUser($socservUserFields, $bSave=false)
static CheckUniqueKey($bUnset=true)
prepareUser($yandexUser, $short=false)
getEntityOAuth($code=false)
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)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
IsModuleInstalled($module_id)
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)
if(empty($signedUserToken)) $key
const SOCSERV_REGISTRATION_DENY
const SOCSERV_AUTHORISATION_ERROR