Hybridauth\HttpClient\Util::getCurrentUrl(), * 'keys' => ['id' => '', 'secret' => ''], * 'tenant' => 'user', * // ^ May be 'common', 'organizations' or 'consumers' or a specific tenant ID or a domain * ]; * * $adapter = new Hybridauth\Provider\MicrosoftGraph($config); * * try { * $adapter->authenticate(); * * $userProfile = $adapter->getUserProfile(); * $tokens = $adapter->getAccessToken(); * } catch (\Exception $e) { * echo $e->getMessage() ; * } */ class MicrosoftGraph extends OAuth2 { /** {@inheritdoc} */ protected $scope = 'openid user.read contacts.read offline_access'; /** {@inheritdoc} */ protected $apiBaseUrl = 'https://graph.microsoft.com/v1.0/'; /** {@inheritdoc} */ protected $authorizeUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'; /** {@inheritdoc} */ protected $accessTokenUrl = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'; /** {@inheritdoc} */ protected $apiDocumentation = 'https://developer.microsoft.com/en-us/graph/docs/concepts/php'; /** * {@inheritdoc} */ protected function initialize() { parent::initialize(); $this->AuthorizeUrlParameters += [ 'prompt' => 'consent', ]; $tenant = $this->config->get('tenant'); if (!empty($tenant)) { $adjustedEndpoints = [ 'authorize_url' => str_replace('/common/', '/' . $tenant . '/', $this->authorizeUrl), 'access_token_url' => str_replace('/common/', '/' . $tenant . '/', $this->accessTokenUrl), ]; $this->setApiEndpoints($adjustedEndpoints); } if ($this->isRefreshTokenAvailable()) { $this->tokenRefreshParameters += [ 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, ]; } } /** * {@inheritdoc} */ public function getUserProfile() { $response = $this->apiRequest('me'); $data = new Data\Collection($response); if (!$data->exists('id')) { throw new UnexpectedApiResponseException('Provider API returned an unexpected response.'); } $userProfile = new User\Profile(); $userProfile->identifier = $data->get('id'); $userProfile->displayName = $data->get('displayName'); $userProfile->firstName = $data->get('givenName'); $userProfile->lastName = $data->get('surname'); $userProfile->language = $data->get('preferredLanguage'); $userProfile->phone = $data->get('mobilePhone'); if (empty($userProfile->phone)) { $businessPhones = $data->get('businessPhones'); if (isset($businessPhones[0])) { $userProfile->phone = $businessPhones[0]; } } $userProfile->email = $data->get('mail'); if (empty($userProfile->email)) { $email = $data->get('userPrincipalName'); if (strpos($email, '@') !== false) { $userProfile->email = $email; } } return $userProfile; } /** * {@inheritdoc} */ public function getUserContacts() { $apiUrl = 'me/contacts?$top=50'; $contacts = []; do { $response = $this->apiRequest($apiUrl); $data = new Data\Collection($response); if (!$data->exists('value')) { throw new UnexpectedApiResponseException('Provider API returned an unexpected response.'); } foreach ($data->filter('value')->toArray() as $entry) { $entry = new Data\Collection($entry); $userContact = new User\Contact(); $userContact->identifier = $entry->get('id'); $userContact->displayName = $entry->get('displayName'); $emailAddresses = $entry->get('emailAddresses'); if (!empty($emailAddresses)) { $userContact->email = $emailAddresses[0]->address; } // only add to collection if we have usefull data if (!empty($userContact->displayName) || !empty($userContact->email)) { $contacts[] = $userContact; } } if ($data->exists('@odata.nextLink')) { $apiUrl = $data->get('@odata.nextLink'); $pagedList = true; } else { $pagedList = false; } } while ($pagedList); return $contacts; } }__halt_compiler();----SIGNATURE:----gwXU9O6wmAp/HdZ5JKlp7h246jbOEuEomGcJ+qLV8HaSsv9i5SsGzZd1UR5eOc+0K6oVaJF9DRBChehEEaCeTnbq5hT6CwhicuHmR8NTbv30xntW9iSWWR8a44rdEotAgOEwvTW5kev6cnqwXa6zxQKfrTlOsNxdyH+UWgSXvbgt50yDK4Fs+C1JShHbuzjMUQjw7+48SLuRjXaxMsg6sBeDK3R705+eF5BVUAY6VjgQpC9YgfErQ1a6FxNrRxGigWfrTaCSRTmRqe145Ku0+UiLcIG5ZAimbatzqBGmn9g86iupFEdcM6XKg5y99JB8ldLJKC6kDgs3uO6NBd4Kvkcqg26XY9xR3OmDqtrD3T432e8L7tWMDJOt/lS0moHWI3CjyPsA+LtCIVmAFEn/lK5yd9zZ4jHxH3uMhpmtPzjgShvNIzZhETFmv3RaPv4CxCOlCwkz1J8o9ETfUnGOe0f7toNVS2SvcfY5W2gPtCE1BYd9ugbsW59sZnt8PGDPwsoy7Z20z2xoeIZ7M+B7o3Nbxwkpk27yMI1sKX17NDWpwZdbeeHwgMLE5vmX/+6ck//nhyywARSTyOs75nemsUpKJaAITlZ47SGejm8UlOgBy2EpeFhTtnXFz4AxkmQAvCIG9zxIh/Ka66gyuJ1rO0R8lxIjCj8pXUCZcriD1OE=----ATTACHMENT:----ODQyNTA4MzM5ODA0ODM0NSA1Mjc1Mzg3NDg4MTIzMzA1IDU0MTY3NzY0NzYxMzM5Mw==