7use Bitrix\SocialServices\UserTable;
39 $state = $this->parseState(
$_REQUEST[
'state']);
41 if(!empty(
$_REQUEST[
"code"]) && $this->checkUserToken($state[
'user_token']))
51 if(is_array($arGoogleUser) && !isset($arGoogleUser[
"error"]))
54 $arFields[
'USER_ID'] = $this->user->getId();
60 $aRemove = [
"logout",
"auth_service_error",
"auth_service_id",
"code",
"error_reason",
"error",
"error_description",
"check_key",
"current_fieldset"];
63 if($this->user && ($authError ===
true))
71 if(isset($state) && is_array($state))
73 if(isset($state[
'backurl']) || isset($state[
'redirect_url']))
75 $url = !empty($state[
'redirect_url']) ? $state[
'redirect_url'] : $state[
'backurl'];
76 if(!str_starts_with(
$url,
"#"))
78 $parseUrl = parse_url(
$url);
80 $urlPath = $parseUrl[
"path"];
81 $arUrlQuery = explode(
'&', $parseUrl[
"query"]);
83 foreach($arUrlQuery as
$key => $value)
85 foreach($aRemove as $param)
87 if(str_starts_with($value, $param .
"="))
89 unset($arUrlQuery[
$key]);
95 $url = (!empty($arUrlQuery)) ? $urlPath .
'?' . implode(
"&", $arUrlQuery) : $urlPath;
103 if(isset($state[
'mode']))
105 $mode = $state[
'mode'];
115 elseif($bSuccess !==
true)
117 $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);
120 if($addParams && CModule::IncludeModule(
"socialnetwork") && !str_contains(
$url,
"current_fieldset="))
122 $url = (preg_match(
"/\?/",
$url)) ?
$url.
"¤t_fieldset=SOCSERV" :
$url.
"?current_fieldset=SOCSERV";
127 if ($bSuccess && $mode === self::MOBILE_MODE)
136 CMain::FinalActions();
148 if($this->userId ===
null)
150 $this->entityOAuth->setRefreshToken(
"skip");
153 if($addScope !==
null)
155 $this->entityOAuth->addScope($addScope);
158 $state =
'provider='.static::ID
160 .
'&backurl=' . urlencode(
163 'check_key=' . \CSocServAuthManager::getUniqueKey(),
164 [
"logout",
"auth_service_error",
"auth_service_id",
"backurl",
'serviceName',
'hitHash']
169 ?
'&redirect_url=' . urlencode(
$arParams[
'BACKURL'])
171 .
'&user_token=' . urlencode($this->generateUserToken())
172 .
'&hostUrl=' . urlencode(\
Bitrix\Main\Engine\UrlManager::getInstance()->getHostUrl())
177 return $this->entityOAuth->GetAuthUrl($redirect_uri, $state,
$arParams[
'APIKEY']);
193 $this->entityOAuth->setCode(
$code);
196 return $this->entityOAuth;
204 private function generateUserToken(): string
206 $configuration = Configuration::getInstance();
207 $cipherKey = $configuration->get(
'crypto')[
'crypto_key'] ??
null;
210 throw new SystemException(
'There is no crypto[crypto_key] in .settings.php. Generate it.');
213 $cipher =
new Cipher();
215 return base64_encode($cipher->encrypt(time() .
'_'. $this->userId .
'_' . self::PROXY_CONST, $cipherKey));
224 private function checkUserToken(
string $userToken =
null): bool
231 $configuration = Configuration::getInstance();
232 $cipherKey = $configuration->get(
'crypto')[
'crypto_key'] ??
null;
235 throw new SystemException(
'There is no crypto[crypto_key] in .settings.php. Generate it.');
238 $cipher =
new Cipher();
239 $data = explode(
'_', $cipher->decrypt(base64_decode(
$userToken), $cipherKey));
242 || ((
$data[0] + 3600) < time())
243 ||
$data[2] !== self::PROXY_CONST
249 $user = \Bitrix\Main\UserTable::query()
250 ->where(
'ID', (
int)
$data[1])
262 $this->userId =
$data[1];
267 private function parseState(
string $requestState =
null): ?
array
275 parse_str($requestState, $state);
287 if(!isset($socservUserFields[
'XML_ID']) || $socservUserFields[
'XML_ID'] ==
'')
292 if(!isset($socservUserFields[
'EXTERNAL_AUTH_ID']) || $socservUserFields[
'EXTERNAL_AUTH_ID'] ==
'')
297 if (!empty($socservUserFields[
'USER_ID']))
299 $this->deleteOldTokens($socservUserFields[
'USER_ID'], $socservUserFields[
'EXTERNAL_AUTH_ID']);
301 $dbSocUser = UserTable::getList(
304 '=XML_ID' => $socservUserFields[
'XML_ID'],
305 '=EXTERNAL_AUTH_ID' => $socservUserFields[
'EXTERNAL_AUTH_ID']
311 $storedUser = $dbSocUser->fetch();
315 $result = UserTable::add(UserTable::filterFields($socservUserFields));
319 $result = UserTable::update($storedUser[
'ID'], UserTable::filterFields($socservUserFields));
334 private function deleteOldTokens(
$userId, $externalAuthId): void
336 $dbTokens = \Bitrix\Socialservices\UserTable::getList(
340 '=EXTERNAL_AUTH_ID' => $externalAuthId
345 while ($accessToken = $dbTokens->fetch())
347 UserTable::delete($accessToken[
'ID']);
354 public const TOKEN_URL =
"https://calendar-proxy-ru-01.bitrix24.com";
365 if(is_array($tokens))
367 $this->access_token = $tokens[
"OATOKEN"];
368 $this->accessTokenExpires = $tokens[
"OATOKEN_EXPIRES"];
378 isset($tokens[
"REFRESH_TOKEN"])
380 $tokens[
"REFRESH_TOKEN"],
393 if($this->code ===
false)
399 "socketTimeout" => $this->httpTimeout
405 "client_id" => $this->appID,
406 "code" => $this->code,
408 "grant_type" =>
"authorization_code",
418 $this->appID =
$result[
'APP_ID'];
419 CSocServGoogleOAuth::SetOption(
"google_proxy_appid", trim(
$result[
'APP_ID']));
420 CSocServGoogleOAuth::SetOption(
"google_proxy_api_key", trim(
$result[
'API_KEY']));
427 catch(\
Bitrix\Main\ArgumentException $e)
429 $this->arResult = [];
432 if(isset($this->arResult[
"access_token"]) && $this->arResult[
"access_token"] <>
'')
434 if(isset($this->arResult[
"refresh_token"]) && $this->arResult[
"refresh_token"] <>
'')
436 $this->refresh_token = $this->arResult[
"refresh_token"];
438 $this->access_token = $this->arResult[
"access_token"];
439 $this->accessTokenExpires = $this->arResult[
"expires_in"] + time();
441 $_SESSION[
"OAUTH_DATA"] = [
455 if($this->appID ===
false)
460 if($refreshToken ===
false)
469 "client_id" => $this->appID,
470 "refresh_token"=>$refreshToken,
471 "grant_type"=>
"refresh_token",
476 array(
"socketTimeout" => $this->httpTimeout)
485 catch(\
Bitrix\Main\ArgumentException $e)
487 $this->arResult = [];
490 if (isset($this->arResult[
"access_token"]) && $this->arResult[
"access_token"] <>
'')
492 $this->access_token = $this->arResult[
"access_token"];
493 $this->accessTokenExpires = $this->arResult[
"expires_in"] + time();
496 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
498 '=EXTERNAL_AUTH_ID' => static::SERVICE_ID,
503 if($arOauth = $dbSocservUser->Fetch())
505 \Bitrix\Socialservices\UserTable::update($arOauth[
"ID"], [
506 "OATOKEN" => $this->access_token,
507 "OATOKEN_EXPIRES" => $this->accessTokenExpires
524 if ($appId = trim(CSocServGoogleOAuth::GetOption(
"google_proxy_appid")))
529 $http =
new HttpClient([
"socketTimeout" => $this->httpTimeout]);
536 CSocServGoogleOAuth::SetOption(
"google_proxy_appid", trim($proxyData[
'APP_ID']));
537 CSocServGoogleOAuth::SetOption(
"google_proxy_api_key", trim($proxyData[
'API_KEY']));
539 return $proxyData[
'APP_ID'];
541 catch(\
Bitrix\Main\ArgumentException $e)
553 return static::TOKEN_URL;
561 $params[
"BX_TYPE"] = Client::getPortalType();
562 $params[
"BX_LICENCE"] = Client::getLicenseCode();
563 $params[
"SERVER_NAME"] = Client::getServerName();
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static get($moduleId, $name, $default="", $siteId=false)
static includeModule($moduleName)
__construct($appID=false, $appSecret=false, $code=false)
getNewAccessToken($refreshToken=false, $userId=0, $save=false)
GetAccessToken($redirect_uri=false)
onAfterWebAuth($addParams, $mode, $url)
prepareUser($arGoogleUser, $short=false)
AuthorizeUser($socservUserFields, $bSave=false)
getEntityOAuth($code=false)
getUrl($location='opener', $addScope=null, $arParams=array())
static checkOAuthProxyParams()
</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)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
if(! $storage) $userToken
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
const SOCSERV_REGISTRATION_DENY
const SOCSERV_AUTHORISATION_ERROR
$GLOBALS['_____370096793']