• Модуль: socialservices
  • Путь к файлу: ~/bitrix/modules/socialservices/classes/general/googleproxy.php
  • Класс: CSocServGoogleProxyOAuth
  • Вызов: CSocServGoogleProxyOAuth::Authorize
public function Authorize()
{
	global $APPLICATION;
	$APPLICATION->RestartBuffer();

	$bSuccess = false;
	$mode = '';
	$addParams = false;

	$authError = SOCSERV_AUTHORISATION_ERROR;

	$state = $this->parseState($_REQUEST['state']);
	if(
		isset($_REQUEST["code"])
		&& $_REQUEST["code"] !== ''
		&& $this->checkUserToken($state['user_token'])
	)
	{
		$this->getEntityOAuth()->setCode($_REQUEST["code"]);

		unset($_REQUEST["state"]);

		if($this->getEntityOAuth()->GetAccessToken() !== false)
		{
			$arGoogleUser = $this->getEntityOAuth()->GetCurrentUser();

			if(is_array($arGoogleUser) && !isset($arGoogleUser["error"]))
			{
				$arFields = $this->prepareUser($arGoogleUser);
				$arFields['USER_ID'] = $this->user->getId();
				$authError = $this->AuthorizeUser($arFields);
			}
		}
	}


	$aRemove = ["logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset"];

	if($this->user && ($authError === true))
	{
		$bSuccess = true;
		CSocServUtil::checkOAuthProxyParams();

		$url = ($APPLICATION->GetCurDir() === "/login/") ? "" : $APPLICATION->GetCurDir();
		$mode = 'opener';
		$addParams = true;
		if(isset($state) && is_array($state))
		{
			if(isset($state['backurl']) || isset($state['redirect_url']))
			{
				$url = !empty($state['redirect_url']) ? $state['redirect_url'] : $state['backurl'];
				if(mb_strpos($url, "#") !== 0)
				{
					$parseUrl = parse_url($url);

					$urlPath = $parseUrl["path"];
					$arUrlQuery = explode('&', $parseUrl["query"]);

					foreach($arUrlQuery as $key => $value)
					{
						foreach($aRemove as $param)
						{
							if(mb_strpos($value, $param."=") === 0)
							{
								unset($arUrlQuery[$key]);
								break;
							}
						}
					}

					$url = (!empty($arUrlQuery)) ? $urlPath . '?' . implode("&", $arUrlQuery) : $urlPath;
				}
				else
				{
					$addParams = false;
				}
			}

			if(isset($state['mode']))
			{
				$mode = $state['mode'];
			}
		}
	}

	if($authError === SOCSERV_REGISTRATION_DENY)
	{
		$url = (preg_match("/?/", $url)) ? $url.'&' : $url.'?';
		$url .= 'auth_service_id='.static::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
	}
	elseif($bSuccess !== true)
	{
		$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);
	}

	if($addParams && CModule::IncludeModule("socialnetwork") && mb_strpos($url, "current_fieldset=") === false)
	{
		$url = (preg_match("/?/", $url)) ? $url."¤t_fieldset=SOCSERV" : $url."?current_fieldset=SOCSERV";
	}

	$url = CUtil::JSEscape($url);

	if($addParams)
	{
		$location = ($mode === "opener") ? 'if(window.opener) window.opener.location = ''.$url.''; window.close();' : ' window.location = ''.$url.'';';
	}
	else
	{
		//fix for chrome
		$location = ($mode === "opener") ? 'if(window.opener) window.opener.location = window.opener.location.href + ''.$url.''; window.close();' : ' window.location = window.location.href + ''.$url.'';';
	}

	$JSScript = '
		
	';

	echo $JSScript;

	CMain::FinalActions();
}