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'; /** {@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(); $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); } } /** * {@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:----FmOk1KvZMMcdFUBlq6o+cQtxaKWvZoyCowbSTkWBDjQjkmKcAVH7o0d02NJlLslLYhDIlhH5J0YyiTKyt157/dOyUM2jqp/C6IZaHPmKpEz8YwXIKDxGiOA0m2NAGsNU9ajqd80ZxK7sETaFtud5jOCIf0Wq4a6tt7UdZrETafMGj8ggtx+txYK8W2IUA78DXfsgZU8wIJdJFDT+yK7TyxKfFH6wCClt5t/ZINOYuAQHZGH9lpE7Gf7/PNWVPcqFiQguSrv6itRkNqwt+A6yhHhPcpGk6IArb1lsZq4rE7gQyS1hZEMzy0gjYwPR6D5e3FPPpiXAma6+jOTQymv11NDzltL5wdNo3/MFRjwiTF2xQygSUeqUuyqkzvu1vQdZDxkHHd1xyCN4UIPs2nyswycBqhjzTODG50CCz3m5rF1oiLUoocc7lsWIv//jU2e4/KDTgYjVRSA4aIAZehmw4AmhAOL23Ym3aTEk1PzoJgaag6twRlPBUY0QzfNY/Hsb6vLlewT3GBgkfQE9RB3LXD59uDu4RazuBaASAA5Oaer1h2VuxFoNSZtRL1Xjmny/acUwceKwjT08Vw5uN48mP4KJuhFrx/ZyVmpiBTZJXLOYuk2mlXECSUUbZZSsTlKbkCi/FTqi6RuYqgtdD48I/pwCzTegjsmJL2b5ADwLHhM=----ATTACHMENT:----MjMxMDk2MDU5ODg1NjIzMyA5MDkyNDYyOTYyNDY3ODcyIDUwODgzODc5NjQ1NzQ0MTI=