6 public const ID =
"Office365";
18 if(!$this->entityOAuth)
21 $this->entityOAuth->setUser($this->userId);
24 return $this->entityOAuth;
29 return 'https://www.bitrix24.com/controller';
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)),
41 '#MAIL_URL#' => \CHttp::urn2uri(
'/bitrix/tools/mail_oauth.php')))),
47 return self::GetOption(
'office365_appid') !==
'' && self::GetOption(
'office365_appsecret') !==
'';
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>';
60 public function GetOnClickJs($arParams)
62 $url = $this->getUrl('opener', null, $arParams);
63 return "BX.util.popup(
'".CUtil::JSEscape($url)."', 580, 400)
";
66 public function getUrl($location = 'opener', $addScope = null, $arParams = array())
79 if(IsModuleInstalled('bitrix24') && defined('BX24_HOST_NAME'))
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'])
88 $state .= urlencode(urlencode("backurl=
".$backurl));
92 $backurl = $APPLICATION->GetCurPageParam(
93 'check_key='.\CSocServAuthManager::getUniqueKey(),
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;
104 return $this->getEntityOAuth()->GetAuthUrl($redirect_uri, $state);
107 public function getStorageToken()
110 $userId = (int)$this->userId;
113 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
114 'filter' => ['=USER_ID' => $userId, "=EXTERNAL_AUTH_ID
" => static::ID],
115 'select' => ["OATOKEN
", "REFRESH_TOKEN
", "OATOKEN_EXPIRES
"]
117 if($arOauth = $dbSocservUser->fetch())
119 $accessToken = $arOauth["OATOKEN
"];
121 if(empty($accessToken) || ((int)$arOauth["OATOKEN_EXPIRES
"] && ((int)($arOauth["OATOKEN_EXPIRES
"] < time()))))
123 if(isset($arOauth['REFRESH_TOKEN']))
125 $this->entityOAuth->getNewAccessToken($arOauth['REFRESH_TOKEN'], $userId, true);
127 if(($accessToken = $this->entityOAuth->getToken()) === false)
138 public function prepareUser($office365User)
140 $email = $first_name = $last_name = "";
141 $login = "Office365
".$office365User['id'];
142 $uId = $office365User['id'];
144 if(!empty($office365User['givenName']))
146 $first_name = $office365User['givenName'];
149 if(!empty($office365User['surname']))
151 $last_name = $office365User['surname'];
154 if(!empty($office365User['mail']))
156 $email = $office365User['mail'];
157 $login = $office365User['mail'];
161 'EXTERNAL_AUTH_ID' => self::ID,
165 'NAME'=> $first_name,
166 'LAST_NAME'=> $last_name,
169 $arFields["PERSONAL_PHONE
"] = $office365User["telephoneNumber
"];
171 if(isset($office365User['access_token']))
173 $arFields["OATOKEN
"] = $office365User['access_token'];
176 if(isset($office365User['refresh_token']))
178 $arFields["REFRESH_TOKEN
"] = $office365User['refresh_token'];
181 if(isset($office365User['expires_in']))
183 $arFields["OATOKEN_EXPIRES
"] = time() + $office365User['expires_in'];
188 $arFields["SITE_ID"] = SITE_ID;
191 $arFields["PERMISSIONS
"] = serialize([
192 "tenant
" => $office365User["tenant
"],
198 public function Authorize()
202 $APPLICATION->RestartBuffer();
204 $bProcessState = false;
205 $bSuccess = SOCSERV_AUTHORISATION_ERROR;
207 if(!empty($_REQUEST["code
"]) && CSocServAuthManager::CheckUniqueKey())
209 $this->getEntityOAuth()->setCode($_REQUEST["code
"]);
211 $bProcessState = true;
213 if($this->getEntityOAuth()->GetAccessToken() !== false)
215 $office365User = $this->getEntityOAuth()->GetCurrentUser();
216 if(is_array($office365User) && !empty($office365User['id']))
218 $office365User["tenant
"] = preg_replace("/^.*@/
", "", $office365User["userPrincipalName
"]);
221 $tenantRestriction = self::GetOption("office365_tenant
");
222 if(!empty($tenantRestriction))
224 $allowAuth = $office365User["tenant
"] === $tenantRestriction;
229 $arFields = $this->prepareUser($office365User);
230 $bSuccess = $this->AuthorizeUser($arFields);
238 unset($_REQUEST["state
"]);
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
"];
246 if(isset($_REQUEST["state
"]))
249 parse_str($_REQUEST["state
"], $arState);
250 if(isset($arState['backurl']) || isset($arState['redirect_url']))
252 $url = !empty($arState['redirect_url']) ? $arState['redirect_url'] : $arState['backurl'];
253 if(!str_starts_with($url, "#
"))
255 $parseUrl = parse_url($url);
256 $urlPath = $parseUrl["path"];
257 $arUrlQuery = explode('&', $parseUrl["query
"]);
259 foreach($arUrlQuery as $key => $value)
261 foreach($aRemove as $param)
263 if(str_starts_with($value, $param . "=
"))
265 unset($arUrlQuery[$key]);
271 $url = (!empty($arUrlQuery)) ? $urlPath.'?'.implode("&
", $arUrlQuery) : $urlPath;
279 if(isset($arState['mode']))
281 $mode = $arState['mode'];
285 if($bSuccess === SOCSERV_REGISTRATION_DENY)
287 $url = (preg_match("/\?/
", $url)) ? $url.'&' : $url.'?';
288 $url .= 'auth_service_id='.self::ID.'&auth_service_error='.SOCSERV_REGISTRATION_DENY;
290 elseif($bSuccess !== true)
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);
297 if($addParams && CModule::IncludeModule("socialnetwork
") && !str_contains($url, "current_fieldset=
"))
299 $url = (preg_match("/\?/
", $url)) ? $url . "¤t_fieldset=SOCSERV
" : $url . "?current_fieldset=SOCSERV
";
302 $url = CUtil::JSEscape($url);
304 if ($bSuccess && $mode === self::MOBILE_MODE)
306 $this->onAfterMobileAuth();
310 $this->onAfterWebAuth($addParams, $mode, $url);
313 CMain::FinalActions();
316 public function getProfileUrl($id)
318 return 'https://portal.office.com/';
323class COffice365OAuthInterface extends CSocServOAuthTransport
325 const SERVICE_ID = "Office365
";
327 const AUTH_URL = "https:
328 const TOKEN_URL =
"https://login.microsoftonline.com/common/oauth2/v2.0/token";
346 $appID = trim(CSocServOffice365OAuth::GetOption(
"office365_appid"));
351 $appSecret = trim(CSocServOffice365OAuth::GetOption(
"office365_appsecret"));
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):
'');
370 $scopesAsString = implode(
' ', array_unique($this->
getScope()));
372 return rawurlencode($scopesAsString);
379 if(is_array($tokens))
381 $this->access_token = $tokens[
"OATOKEN"];
382 $this->accessTokenExpires = $tokens[
"OATOKEN_EXPIRES"];
390 elseif(isset($tokens[
"REFRESH_TOKEN"]))
402 if($this->code ===
false)
407 if($redirect_uri ===
false)
411 $redirect_uri = \CSocServOffice365OAuth::getControllerUrl().
"/redirect.php";
419 $httpClient = new \Bitrix\Main\Web\HttpClient();
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);
430 $result = $httpClient->post(static::TOKEN_URL, $requestData);
436 $this->access_token =
$arResult[
"access_token"];
437 $this->accessTokenExpires =
$arResult[
"expires_in"];
440 $this->refresh_token =
$arResult[
"refresh_token"];
442 $_SESSION[
"OAUTH_DATA"] =
array(
"OATOKEN" => $this->access_token);
450 if($this->appID ==
false || $this->appSecret ==
false)
453 $httpClient = new \Bitrix\Main\Web\HttpClient();
456 "refresh_token"=>$refreshToken,
457 "client_id"=>$this->appID,
458 "client_secret"=>$this->appSecret,
459 "grant_type"=>
"refresh_token",
466 catch(\
Bitrix\Main\ArgumentException $e)
473 $this->access_token =
$arResult[
"access_token"];
474 $this->accessTokenExpires =
$arResult[
"expires_in"];
477 $dbSocservUser = \Bitrix\Socialservices\UserTable::getList([
478 'filter' => [
'=USER_ID' => intval(
$userId),
"=EXTERNAL_AUTH_ID" => static::SERVICE_ID],
481 if($arOauth = $dbSocservUser->fetch())
482 \Bitrix\Socialservices\UserTable::update($arOauth[
"ID"],
array(
"OATOKEN" => $this->access_token,
"OATOKEN_EXPIRES" => time() + $this->accessTokenExpires));
491 return $this->resource;
496 if($this->access_token ===
false)
499 $httpClient = new \Bitrix\Main\Web\HttpClient();
500 $httpClient->setHeader(
"Authorization",
"Bearer ". $this->access_token);
502 $result = $httpClient->get($this->resource.static::VERSION.static::CONTACTS_URL);
507 $result[
"access_token"] = $this->access_token;
508 $result[
"refresh_token"] = $this->refresh_token;
509 $result[
"expires_in"] = $this->accessTokenExpires;
517 if($tokenInfo && $tokenInfo[
"PERMISSIONS"])
519 $permissions = unserialize($tokenInfo[
"PERMISSIONS"], [
"allowed_classes" =>
false]);
521 return $permissions[
"tenant"];
529 return \CHTTP::URN2URI(static::REDIRECT_URI);
546 $tenant = trim(CSocServOffice365OAuth::GetOption(
"office365_tenant"));
556 return $this->tenant;
562 $this->resource = str_replace(
"#TENANT#", $this->tenant, static::RESOURCE_TPL);
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
getNewAccessToken($refreshToken, $userId=0, $save=false)
__construct($appID=false, $appSecret=false, $code=false)
GetAuthUrl($redirect_uri, $state='')
GetAccessToken($redirect_uri=false)
__construct($tenant=false, $appID=false, $appSecret=false, $code=false)
static getControllerUrl()
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)
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)