1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
office365.php
См. документацию.
1<?
3
5{
6 public const ID = "Office365";
11 public const CONTROLLER_URL = 'https://www.bitrix24.com/controller';
12
14 protected $entityOAuth = null;
15
16 public function getEntityOAuth()
17 {
18 if(!$this->entityOAuth)
19 {
20 $this->entityOAuth = new COffice365OAuthInterface();
21 $this->entityOAuth->setUser($this->userId);
22 }
23
24 return $this->entityOAuth;
25 }
26
27 public static function getControllerUrl(): string
28 {
29 return 'https://www.bitrix24.com/controller';
30 }
31
32
33 public function GetSettings()
34 {
35 return array(
36 array("office365_appid", GetMessage("socserv_office365_client_id"), "", Array("text", 40)),
37 array("office365_appsecret", GetMessage("socserv_office365_client_secret"), "", Array("text", 40)),
38 array("office365_tenant", GetMessage("socserv_office365_tenant"), "", Array("text", 40)),
39 array("note"=>GetMessage("socserv_office365_form_note", array(
40 '#URL#' => $this->getEntityOAuth()->getRedirectUri(),
41 '#MAIL_URL#' => \CHttp::urn2uri('/bitrix/tools/mail_oauth.php')))),
42 );
43 }
44
45 public function CheckSettings()
46 {
47 return self::GetOption('office365_appid') !== '' && self::GetOption('office365_appsecret') !== '';
48 }
49
50 public function GetFormHtml($arParams)
51 {
52 $url = $this->getUrl('opener', null, $arParams);
53 if($arParams["FOR_INTRANET"])
54 {
55 return array("ON_CLICK" => 'onclick="BX.util.popup(\'' . htmlspecialcharsbx(CUtil::JSEscape($url)) . '\', 580, 400)"');
56 }
57 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>';
58 }
59
60 public function GetOnClickJs($arParams)
61 {
62 $url = $this->getUrl('opener', null, $arParams);
63 return "BX.util.popup('".CUtil::JSEscape($url)."', 580, 400)";
64 }
65
66 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
67 {
68 global $APPLICATION;
69
70 $removeParams = [
71 'logout',
72 'auth_service_error',
73 'auth_service_id',
74 'backurl',
75 'serviceName',
76 'hitHash',
77 ];
78
79 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
80 {
81 $redirect_uri = \CSocServOffice365OAuth::getControllerUrl()."/redirect.php";
82 $state = $this->getEntityOAuth()->getRedirectUri()."?state=";
83 $backurl = urlencode($GLOBALS["APPLICATION"]->GetCurPageParam('check_key='.\CSocServAuthManager::getUniqueKey(), $removeParams))
84 .(isset($arParams['BACKURL'])
85 ? '&redirect_url='.urlencode($arParams['BACKURL'])
86 : '')
87 .'&mode='.$location;
88 $state .= urlencode(urlencode("backurl=".$backurl));
89 }
90 else
91 {
92 $backurl = $APPLICATION->GetCurPageParam(
93 'check_key='.\CSocServAuthManager::getUniqueKey(),
94 $removeParams
95 );
96
97 $redirect_uri = $this->getEntityOAuth()->getRedirectUri();
98 $state = 'site_id='.SITE_ID.'&backurl='.urlencode($backurl)
99 .(isset($arParams['BACKURL'])
100 ? '&redirect_url='.urlencode($arParams['BACKURL'])
101 : '').'&mode='.$location;
102 }
103
104 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
105 }
106
107 public function getStorageToken()
108 {
109 $accessToken = null;
110 $userId = (int)$this->userId;
111 if($userId > 0)
112 {
113 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
114 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID" => static::ID],
115 'select' => ["OATOKEN", "REFRESH_TOKEN", "OATOKEN_EXPIRES"]
116 ]);
117 if($arOauth = $dbSocservUser->fetch())
118 {
119 $accessToken = $arOauth["OATOKEN"];
120
121 if(empty($accessToken) || ((int)$arOauth["OATOKEN_EXPIRES"] && ((int)($arOauth["OATOKEN_EXPIRES"] < time()))))
122 {
123 if(isset($arOauth['REFRESH_TOKEN']))
124 {
125 $this->entityOAuth->getNewAccessToken($arOauth['REFRESH_TOKEN'], $userId, true);
126 }
127 if(($accessToken = $this->entityOAuth->getToken()) === false)
128 {
129 return null;
130 }
131 }
132 }
133 }
134
135 return $accessToken;
136 }
137
138 public function prepareUser($office365User)
139 {
140 $email = $first_name = $last_name = "";
141 $login = "Office365".$office365User['id'];
142 $uId = $office365User['id'];
143
144 if(!empty($office365User['givenName']))
145 {
146 $first_name = $office365User['givenName'];
147 }
148
149 if(!empty($office365User['surname']))
150 {
151 $last_name = $office365User['surname'];
152 }
153
154 if(!empty($office365User['mail']))
155 {
156 $email = $office365User['mail'];
157 $login = $office365User['mail'];
158 }
159
160 $arFields = [
161 'EXTERNAL_AUTH_ID' => self::ID,
162 'XML_ID' => $uId,
163 'LOGIN' => $login,
164 'EMAIL' => $email,
165 'NAME'=> $first_name,
166 'LAST_NAME'=> $last_name,
167 ];
168
169 $arFields["PERSONAL_PHONE"] = $office365User["telephoneNumber"];
170
171 if(isset($office365User['access_token']))
172 {
173 $arFields["OATOKEN"] = $office365User['access_token'];
174 }
175
176 if(isset($office365User['refresh_token']))
177 {
178 $arFields["REFRESH_TOKEN"] = $office365User['refresh_token'];
179 }
180
181 if(isset($office365User['expires_in']))
182 {
183 $arFields["OATOKEN_EXPIRES"] = time() + $office365User['expires_in'];
184 }
185
186 if(!empty(SITE_ID))
187 {
188 $arFields["SITE_ID"] = SITE_ID;
189 }
190
191 $arFields["PERMISSIONS"] = serialize([
192 "tenant" => $office365User["tenant"],
193 ]);
194
195 return $arFields;
196 }
197
198 public function Authorize()
199 {
200 global $APPLICATION;
201
202 $APPLICATION->RestartBuffer();
203
204 $bProcessState = false;
205 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
206
207 if(!empty($_REQUEST["code"]) && CSocServAuthManager::CheckUniqueKey())
208 {
209 $this->getEntityOAuth()->setCode($_REQUEST["code"]);
210
211 $bProcessState = true;
212
213 if($this->getEntityOAuth()->GetAccessToken() !== false)
214 {
215 $office365User = $this->getEntityOAuth()->GetCurrentUser();
216 if(is_array($office365User) && !empty($office365User['id']))
217 {
218 $office365User["tenant"] = preg_replace("/^.*@/", "", $office365User["userPrincipalName"]);
219
220 $allowAuth = true;
221 $tenantRestriction = self::GetOption("office365_tenant");
222 if(!empty($tenantRestriction))
223 {
224 $allowAuth = $office365User["tenant"] === $tenantRestriction;
225 }
226
227 if($allowAuth)
228 {
229 $arFields = $this->prepareUser($office365User);
230 $bSuccess = $this->AuthorizeUser($arFields);
231 }
232 }
233 }
234 }
235
236 if(!$bProcessState)
237 {
238 unset($_REQUEST["state"]);
239 }
240
241 $url = ($APPLICATION->GetCurDir() === "/login/") ? "" : $APPLICATION->GetCurDir();
242 $aRemove = ["logout", "auth_service_error", "auth_service_id", "code", "error_reason", "error", "error_description", "check_key", "current_fieldset"];
243
244 $mode = 'opener';
245 $addParams = true;
246 if(isset($_REQUEST["state"]))
247 {
248 $arState = array();
249 parse_str($_REQUEST["state"], $arState);
250 if(isset($arState['backurl']) || isset($arState['redirect_url']))
251 {
252 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
253 if(!str_starts_with($url, "#"))
254 {
255 $parseUrl = parse_url($url);
256 $urlPath = $parseUrl["path"];
257 $arUrlQuery = explode('&', $parseUrl["query"]);
258
259 foreach($arUrlQuery as $key => $value)
260 {
261 foreach($aRemove as $param)
262 {
263 if(str_starts_with($value, $param . "="))
264 {
265 unset($arUrlQuery[$key]);
266 break;
267 }
268 }
269 }
270
271 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&", $arUrlQuery) : $urlPath;
272 }
273 else
274 {
275 $addParams = false;
276 }
277 }
278
279 if(isset($arState['mode']))
280 {
281 $mode = $arState['mode'];
282 }
283 }
284
285 if($bSuccess === SOCSERV_REGISTRATION_DENY)
286 {
287 $url = (preg_match("/\?/", $url)) ? $url.'&' : $url.'?';
288 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
289 }
290 elseif($bSuccess !== true)
291 {
292 $url = (isset($parseUrl))
293 ? $urlPath.'?auth_service_id='.self::ID.'&auth_service_error='.$bSuccess
294 : $APPLICATION->GetCurPageParam(('auth_service_id='.self::ID.'&auth_service_error='.$bSuccess), $aRemove);
295 }
296
297 if($addParams && CModule::IncludeModule("socialnetwork") && !str_contains($url, "current_fieldset="))
298 {
299 $url = (preg_match("/\?/", $url)) ? $url . "&current_fieldset=SOCSERV" : $url . "?current_fieldset=SOCSERV";
300 }
301
302 $url = CUtil::JSEscape($url);
303
304 if ($bSuccess && $mode === self::MOBILE_MODE)
305 {
306 $this->onAfterMobileAuth();
307 }
308 else
309 {
310 $this->onAfterWebAuth($addParams, $mode, $url);
311 }
312
313 CMain::FinalActions();
314 }
315
316 public function getProfileUrl($id)
317 {
318 return 'https://portal.office.com/';
319 }
320
321}
322
323class COffice365OAuthInterface extends CSocServOAuthTransport
324{
325 const SERVICE_ID = "Office365";
326
327 const AUTH_URL = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize";
328 const TOKEN_URL = "https://login.microsoftonline.com/common/oauth2/v2.0/token";
329
330 const VERSION = "/v1.0";
331
332 const CONTACTS_URL = "/me/";
333
334 const REDIRECT_URI = "/bitrix/tools/oauth/office365.php";
335
336 protected $resource = "https://graph.microsoft.com";
337 protected $scope = [
338 "User.Read",
339 "offline_access",
340 ];
341
342 public function __construct($appID = false, $appSecret = false, $code=false)
343 {
344 if($appID === false)
345 {
346 $appID = trim(CSocServOffice365OAuth::GetOption("office365_appid"));
347 }
348
349 if($appSecret === false)
350 {
351 $appSecret = trim(CSocServOffice365OAuth::GetOption("office365_appsecret"));
352 }
353
354 parent::__construct($appID, $appSecret, $code);
355 }
356
357 public function GetAuthUrl($redirect_uri, $state='')
358 {
359 return static::AUTH_URL.
360 "?client_id=".urlencode($this->appID).
361 "&redirect_uri=".urlencode($redirect_uri).
362 "&response_type=code".
363 "&scope=".$this->getScopeEncode().
364 "&prompt=select_account".
365 ($state <> ''? '&state='.urlencode($state):'');
366 }
367
368 public function getScopeEncode(): string
369 {
370 $scopesAsString = implode(' ', array_unique($this->getScope()));
371
372 return rawurlencode($scopesAsString);
373 }
374
375 public function GetAccessToken($redirect_uri = false)
376 {
377 $tokens = $this->getStorageTokens();
378
379 if(is_array($tokens))
380 {
381 $this->access_token = $tokens["OATOKEN"];
382 $this->accessTokenExpires = $tokens["OATOKEN_EXPIRES"];
383
384 if(!$this->code)
385 {
386 if($this->checkAccessToken())
387 {
388 return true;
389 }
390 elseif(isset($tokens["REFRESH_TOKEN"]))
391 {
392 if($this->getNewAccessToken($tokens["REFRESH_TOKEN"], $this->userId, true))
393 {
394 return true;
395 }
396 }
397 }
398
399 $this->deleteStorageTokens();
400 }
401
402 if($this->code === false)
403 {
404 return false;
405 }
406
407 if($redirect_uri === false)
408 {
409 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
410 {
411 $redirect_uri = \CSocServOffice365OAuth::getControllerUrl()."/redirect.php";
412 }
413 else
414 {
415 $redirect_uri = $this->getRedirectUri();
416 }
417 }
418
419 $httpClient = new \Bitrix\Main\Web\HttpClient();
420
421 $requestData = http_build_query([
422 "code" => $this->code,
423 "client_id" => $this->appID,
424 "client_secret" => $this->appSecret,
425 "redirect_uri" => $redirect_uri,
426 "grant_type" => "authorization_code",
427 "scope" => implode(' ', array_unique($this->getScope())),
428 ], '', '&', PHP_QUERY_RFC3986);
429
430 $result = $httpClient->post(static::TOKEN_URL, $requestData);
431
433
434 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
435 {
436 $this->access_token = $arResult["access_token"];
437 $this->accessTokenExpires = $arResult["expires_in"];
438 if(isset($arResult["refresh_token"]) && $arResult["refresh_token"] <> '')
439 {
440 $this->refresh_token = $arResult["refresh_token"];
441 }
442 $_SESSION["OAUTH_DATA"] = array("OATOKEN" => $this->access_token);
443 return true;
444 }
445 return false;
446 }
447
448 public function getNewAccessToken($refreshToken, $userId = 0, $save = false)
449 {
450 if($this->appID == false || $this->appSecret == false)
451 return false;
452
453 $httpClient = new \Bitrix\Main\Web\HttpClient();
454
455 $result = $httpClient->post(static::TOKEN_URL, array(
456 "refresh_token"=>$refreshToken,
457 "client_id"=>$this->appID,
458 "client_secret"=>$this->appSecret,
459 "grant_type"=>"refresh_token",
460 ));
461
462 try
463 {
465 }
466 catch(\Bitrix\Main\ArgumentException $e)
467 {
468 $arResult = array();
469 }
470
471 if(isset($arResult["access_token"]) && $arResult["access_token"] <> '')
472 {
473 $this->access_token = $arResult["access_token"];
474 $this->accessTokenExpires = $arResult["expires_in"];
475 if($save && intval($userId) > 0)
476 {
477 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
478 'filter' => ['=USER_ID' => intval($userId), "=EXTERNAL_AUTH_ID" => static::SERVICE_ID],
479 'select' => ["ID"]
480 ]);
481 if($arOauth = $dbSocservUser->fetch())
482 \Bitrix\Socialservices\UserTable::update($arOauth["ID"], array("OATOKEN" => $this->access_token,"OATOKEN_EXPIRES" => time() + $this->accessTokenExpires));
483 }
484 return true;
485 }
486 return false;
487 }
488
489 public function getResource()
490 {
491 return $this->resource;
492 }
493
494 public function GetCurrentUser()
495 {
496 if($this->access_token === false)
497 return false;
498
499 $httpClient = new \Bitrix\Main\Web\HttpClient();
500 $httpClient->setHeader("Authorization", "Bearer ". $this->access_token);
501
502 $result = $httpClient->get($this->resource.static::VERSION.static::CONTACTS_URL);
504
505 if(is_array($result))
506 {
507 $result["access_token"] = $this->access_token;
508 $result["refresh_token"] = $this->refresh_token;
509 $result["expires_in"] = $this->accessTokenExpires;
510 }
511 return $result;
512 }
513
514 public function getTenant()
515 {
516 $tokenInfo = $this->getStorageTokens();
517 if($tokenInfo && $tokenInfo["PERMISSIONS"])
518 {
519 $permissions = unserialize($tokenInfo["PERMISSIONS"], ["allowed_classes" => false]);
520
521 return $permissions["tenant"];
522 }
523
524 return false;
525 }
526
527 public function getRedirectUri()
528 {
529 return \CHTTP::URN2URI(static::REDIRECT_URI);
530 }
531}
532
533/* @deprecated */
535{
536 const RESOURCE_TPL = "https://#TENANT#-my.sharepoint.com";
537
538 const VERSION = "/_api/v2.0";
539
540 protected $tenant = null;
541
542 public function __construct($tenant = false, $appID = false, $appSecret = false, $code=false)
543 {
544 if($tenant === false)
545 {
546 $tenant = trim(CSocServOffice365OAuth::GetOption("office365_tenant"));
547 }
548
549 $this->setTenant($tenant);
550
551 return parent::__construct($appID, $appSecret, $code);
552 }
553
554 public function getTenant()
555 {
556 return $this->tenant;
557 }
558
559 public function setTenant($tenant)
560 {
561 $this->tenant = $tenant;
562 $this->resource = str_replace("#TENANT#", $this->tenant, static::RESOURCE_TPL);
563 }
564}
565
566?>
$arParams
Определения access_dialog.php:21
$arResult
Определения generate_coupon.php:16
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
Определения change_password.php:57
static decode($data)
Определения json.php:50
getNewAccessToken($refreshToken, $userId=0, $save=false)
Определения office365.php:448
__construct($appID=false, $appSecret=false, $code=false)
Определения office365.php:342
const CONTACTS_URL
Определения office365.php:332
const TOKEN_URL
Определения office365.php:328
GetCurrentUser()
Определения office365.php:494
getScopeEncode()
Определения office365.php:368
GetAuthUrl($redirect_uri, $state='')
Определения office365.php:357
getRedirectUri()
Определения office365.php:527
getResource()
Определения office365.php:489
getTenant()
Определения office365.php:514
const REDIRECT_URI
Определения office365.php:334
GetAccessToken($redirect_uri=false)
Определения office365.php:375
const VERSION
Определения office365.php:330
const RESOURCE_TPL
Определения office365.php:536
setTenant($tenant)
Определения office365.php:559
const VERSION
Определения office365.php:538
__construct($tenant=false, $appID=false, $appSecret=false, $code=false)
Определения office365.php:542
Определения authmanager.php:985
getStorageTokens()
Определения oauthtransport.php:116
deleteStorageTokens()
Определения oauthtransport.php:134
checkAccessToken()
Определения oauthtransport.php:153
const ID
Определения office365.php:6
CheckSettings()
Определения office365.php:45
GetSettings()
Определения office365.php:33
$entityOAuth
Определения office365.php:14
getEntityOAuth()
Определения office365.php:16
static getControllerUrl()
Определения office365.php:27
const CONTROLLER_URL
Определения office365.php:11
getUrl($location='opener', $addScope=null, $arParams=array())
Определения office365.php:66
GetFormHtml($arParams)
Определения office365.php:50
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$save
Определения iblock_catalog_edit.php:365
IsModuleInstalled($module_id)
Определения tools.php:5301
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
const SITE_ID
Определения sonet_set_content_view.php:12
path
Определения template_copy.php:201
$url
Определения iframe.php:7