9 const ID =
"Bitrix24OAuth";
28 return parent::__construct(
$userId);
33 if(!$this->entityOAuth)
40 $this->entityOAuth->setCode(
$code);
59 if($addScope !==
null)
72 $userId = intval($this->userId);
75 $dbSocservUser = UserTable::getList([
78 '=XML_ID' => $this->appID,
79 "=EXTERNAL_AUTH_ID" =>
"Bitrix24OAuth",
80 '=PERSONAL_WWW' => $this->portalURI
82 'select' => [
"OATOKEN",
"REFRESH_TOKEN",
"OATOKEN_EXPIRES",
"OASECRET"]
84 if($arOauth = $dbSocservUser->fetch())
86 $accessToken = $arOauth[
"OATOKEN"];
90 (intval($arOauth[
"OATOKEN_EXPIRES"]) > 0)
91 && (intval($arOauth[
"OATOKEN_EXPIRES"] < intval(time())))
95 if(isset($arOauth[
'REFRESH_TOKEN']))
120 $appID = trim(COption::GetOptionString(
"socialservices",
"bitrix24_gadget_appid",
''));
121 $appSecret = trim(COption::GetOptionString(
"socialservices",
"bitrix24_gadget_appsecret",
''));
127 $this->entityOAuth = $gAuth;
128 $gAuth->addScope(explode(
',',
$_REQUEST[
"scope"]));
129 if($gAuth->GetAccessToken($redirect_uri) !==
false)
131 $gAuth->saveDataDB();
137 $location = ($mode ==
"opener") ?
'if(window.opener) window.opener.location = \''.
$url.
'\'; window.close();
' : ' window.location = \
''.$url.
'\';
';
146 CMain::FinalActions();
149 public static function gadgetAuthorize()
152 $APPLICATION->RestartBuffer();
154 if((isset($_REQUEST["code"]) && $_REQUEST["code"] <> '') && CSocServAuthManager::CheckUniqueKey())
156 CUserOptions::SetOption('socialservices
', 'bitrix24_task_planer_gadget_code
', $_REQUEST["code"]);
159 $url = \CHTTP::URN2URI(BX_ROOT);
161 $url = CUtil::JSEscape($url);
162 $location = ($mode == "opener") ? 'if(window.opener) window.opener.location = \
''.$url.
'\'; window.close();
' : ' window.location = \
''.$url.
'\';
';
175class CBitrixOAuthInterface extends CSocServOAuthTransport
177 const SERVICE_ID = 'Bitrix24OAuth
';
180 protected $appSecret;
181 protected $code = false;
182 protected $access_token = false;
183 protected $member_id = false;
185 protected $signatureKey = false;
187 protected $accessTokenExpires = 0;
188 protected $refresh_token = '';
189 protected $portalURI = '';
190 protected $scope = array();
192 public function __construct($appID, $appSecret, $portalURI, $code = false)
194 $this->portalURI = $portalURI;
196 return parent::__construct($appID, $appSecret, $code);
199 public function getMemberId()
201 return $this->member_id;
204 public function GetAuthUrl($redirect_uri, $state = '')
206 return $this->portalURI.'/oauth/authorize/
'.
207 "?client_id=".urlencode($this->appID).
208 "&redirect_uri=".urlencode($redirect_uri).
209 "&scope=".$this->getScopeEncode().
210 "&response_type=code".
211 ($state != '' ? '&state=
'.urlencode($state) : '');
214 public function GetAccessToken($redirect_uri)
216 if($this->code === false)
221 $httpClient = new \Bitrix\Main\Web\HttpClient(array(
222 "socketTimeout" => $this->httpTimeout
225 $result = $httpClient->get($this->portalURI.'/oauth/token/
'.
226 '?code=
'.$this->code.
227 '&client_id=
'.$this->appID.
228 '&client_secret=
'.$this->appSecret.
229 '&redirect_uri=
'.$redirect_uri.
230 '&scope=
'.$this->getScopeEncode().
231 '&grant_type=authorization_code
');
233 $arResult = \Bitrix\Main\Web\Json::decode($result);
235 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
237 $this->access_token = $arResult["access_token"];
238 $this->accessTokenExpires = time() + $arResult["expires_in"];
239 $this->member_id = $arResult["member_id"];
241 if(isset($arResult["refresh_token"]) && $arResult["refresh_token"] <> '')
243 $this->refresh_token = $arResult["refresh_token"];
251 public function getNewAccessToken($refreshToken, $userId = 0, $save = false, $scope = array())
253 if($this->appID == false || $this->appSecret == false)
260 $this->addScope($scope);
263 $httpClient = new \Bitrix\Main\Web\HttpClient(array(
264 "socketTimeout" => $this->httpTimeout
267 $result = $httpClient->get($this->portalURI."/oauth/token/".
268 "?client_id=".urlencode($this->appID).
269 "&grant_type=refresh_token".
270 "&client_secret=".$this->appSecret.
271 "&refresh_token=".$refreshToken.
272 '&scope=
'.$this->getScopeEncode());
274 $arResult = \Bitrix\Main\Web\Json::decode($result);
276 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
278 $this->access_token = $arResult["access_token"];
279 $this->accessTokenExpires = $arResult["expires_in"];
280 $this->member_id = $arResult["member_id"];
282 if(isset($arResult["refresh_token"]) && $arResult["refresh_token"] <> '')
284 $this->refresh_token = $arResult["refresh_token"];
287 if($save && intval($userId) > 0)
289 CUserOptions::SetOption('socialservices
', 'bitrix24_task_planer_gadget_token
', $this->access_token, false, $userId);
290 CUserOptions::SetOption('socialservices
', 'bitrix24_task_planer_gadget_token_expire
', $this->accessTokenExpires + time(), false, $userId);
291 CUserOptions::SetOption('socialservices
', 'bitrix24_task_planer_gadget_refresh_token
', $this->refresh_token, false, $userId);
300 public function saveDataDB()
304 $dbSocUser = UserTable::getList([
306 '=XML_ID
' => $this->appID,
307 '=PERSONAL_WWW
' => $this->portalURI,
308 '=EXTERNAL_AUTH_ID
' => 'Bitrix24OAuth
'
313 if($USER->IsAuthorized())
316 'PERSONAL_WWW
' => $this->portalURI,
317 'XML_ID
' => $this->appID,
318 'EXTERNAL_AUTH_ID
' => static::SERVICE_ID,
319 'USER_ID
' => $USER->GetID(),
320 'OATOKEN
' => $this->access_token,
321 'OATOKEN_EXPIRES
' => $this->accessTokenExpires,
322 'OASECRET
' => $this->getSignatureKey(),
323 'LOGIN
' => $this->appID,
326 if($this->refresh_token <> '')
328 $arFields['REFRESH_TOKEN
'] = $this->refresh_token;
331 if($arUser = $dbSocUser->fetch())
333 $result = UserTable::update($arUser["ID"], $arFields);
334 return $result->isSuccess() ? $arUser["ID"] : false;
338 $result = UserTable::add($arFields);
339 return $result->isSuccess() ? $result->getId() : false;
345 public function getSignatureKey()
347 if($this->member_id && $this->appSecret)
349 $this->signatureKey = md5($this->member_id.$this->appSecret);
352 return $this->signatureKey;
356class CBitrixPHPAppTransport
358 protected $access_token = '';
359 protected $signatureKey = false;
361 protected $portalURI = '';
362 protected $httpTimeout = SOCSERV_DEFAULT_HTTP_TIMEOUT;
364 public function __construct($access_token, $portalURI, $signatureKey = false)
366 $this->access_token = $access_token;
367 $this->portalURI = $portalURI;
368 $this->signatureKey = $signatureKey;
371 public function setSignatureKey($signatureKey)
373 $this->signatureKey = $signatureKey;
376 protected function prepareAnswer($result)
378 return \Bitrix\Main\Web\Json::decode($result);
381 protected function prepareRequest($params)
383 if(is_array($params))
385 $params = CHTTP::PrepareData($params);
391 public function call($methodName, $additionalParams = '')
393 $httpClient = new \Bitrix\Main\Web\HttpClient(array(
394 "socketTimeout" => $this->httpTimeout
397 $result = $httpClient->post($this->portalURI.'/rest/
'.$methodName, 'auth=
'.$this->access_token.'&
'.static::prepareRequest($additionalParams));
399 return $this->prepareAnswer($result);
402 public function callSigned($methodName, $additionalParams = '')
404 if($this->signatureKey)
406 $state = RandString(32);
408 $result = $this->call($methodName, 'state=
' . $state . "&" . static::prepareRequest($additionalParams));
410 if(is_array($result) && isset($result["signature"]))
412 $signer = new Bitrix\Socialservices\Bitrix24Signer();
413 $signer->setKey($this->signatureKey);
418 $signatureCheck = $signer->unsign($result["signature"]);
421 $signatureCheck["state"] === $state
424 foreach($signatureCheck as $key => $value)
428 if($result['result
'][$key] !== $value)
435 unset($result["signature"]);
441 //catch (Bitrix\Main\Security\Sign\BadSignatureException $e)
449 public function batch($actions)
453 if(is_array($actions))
455 foreach($actions as $query_key => $arCmd)
457 list($cmd, $arParams) = array_values($arCmd);
458 $arBatch['cmd
'][$query_key] = $cmd.'?
'.CHTTP::PrepareData($arParams);
461 $arBatch['auth
'] = $this->access_token;
462 $batch_url = '/rest/
batch';
464 $httpClient = new \Bitrix\Main\Web\HttpClient();
465 $result = $httpClient->post($this->portalURI.$batch_url, $arBatch);
467 return $this->prepareAnswer($result);
470 public function getAllMethods()
472 return $this->call('methods
', array('full
' => 'true'));
475 public function getPlannerTasksId()
477 return $this->call('task.planner.getlist
');
480 public function getCurrentUser($signatureKey = '')
482 if($signatureKey !== '')
484 $this->setSignatureKey($signatureKey);
487 if($this->signatureKey)
489 return $this->callSigned('user.current
');
493 return $this->call('user.current
');
static URN2URI($urn, $server_name='')
static CheckUniqueKey($bUnset=true)
getAccessToken($code, $addScope=null)
__construct($appID, $appSecret, $portalURI, $redirectURI, $userId=null)
getEntityOAuth($code=false)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)