diff --git a/src/clients/microsoftentra/provider/MicrosoftEntra.php b/src/clients/microsoftentra/provider/MicrosoftEntra.php
new file mode 100644
index 0000000..53bed7c
--- /dev/null
+++ b/src/clients/microsoftentra/provider/MicrosoftEntra.php
@@ -0,0 +1,75 @@
+tenant;
+ }
+
+ public function getBaseAuthorizationUrl(): string
+ {
+ return $this->baseUrl() . '/oauth2/v2.0/authorize';
+ }
+
+ public function getBaseAccessTokenUrl(array $params): string
+ {
+ return $this->baseUrl() . '/oauth2/v2.0/token';
+ }
+
+ public function getResourceOwnerDetailsUrl(AccessToken $token): string
+ {
+ return 'https://graph.microsoft.com/v1.0/me';
+ }
+
+ protected function getDefaultScopes(): array
+ {
+ return ['User.Read'];
+ }
+
+ protected function getScopeSeparator(): string
+ {
+ return ' ';
+ }
+
+ protected function checkResponse(ResponseInterface $response, $data): void
+ {
+ if (isset($data['error'])) {
+ $statusCode = $response->getStatusCode();
+ $error = $data['error'];
+ $errorDescription = $data['error_description'];
+ $errorLink = ($data['error_uri'] ?? false);
+
+ throw new IdentityProviderException(
+ $statusCode . ' - ' . $errorDescription . ': ' . $error . ($errorLink ? ' (see: ' . $errorLink . ')' : ''),
+ $response->getStatusCode(),
+ $response
+ );
+ }
+ }
+
+ protected function createResourceOwner(array $response, AccessToken $token): MicrosoftEntraResourceOwner
+ {
+ return new MicrosoftEntraResourceOwner($response);
+ }
+
+ protected function getAccessTokenRequest(array $params): RequestInterface
+ {
+ $request = parent::getAccessTokenRequest($params);
+ $uri = $request->getUri()->withUserInfo($this->clientId, $this->clientSecret);
+
+ return $request->withUri($uri);
+ }
+}
diff --git a/src/clients/microsoftentra/provider/MicrosoftEntraResourceOwner.php b/src/clients/microsoftentra/provider/MicrosoftEntraResourceOwner.php
new file mode 100644
index 0000000..c47a184
--- /dev/null
+++ b/src/clients/microsoftentra/provider/MicrosoftEntraResourceOwner.php
@@ -0,0 +1,67 @@
+response = $response;
+ }
+
+ public function getId(): ?string
+ {
+ return $this->getValueByKey($this->response, 'id');
+ }
+
+ public function getFullName(): ?string
+ {
+ return $this->getValueByKey($this->response, 'displayName');
+ }
+
+ public function getFirstName(): ?string
+ {
+ return $this->getValueByKey($this->response, 'givenName');
+ }
+
+ public function getLastName(): ?string
+ {
+ return $this->getValueByKey($this->response, 'surname');
+ }
+
+ public function getEmail(): ?string
+ {
+ return $this->getValueByKey($this->response, 'mail');
+ }
+
+ public function getUpn(): ?string
+ {
+ return $this->getValueByKey($this->response, 'userPrincipalName');
+ }
+
+ public function getJobTitle(): ?string
+ {
+ return $this->getValueByKey($this->response, 'jobTitle');
+ }
+
+ public function getMobilePhone(): ?string
+ {
+ return $this->getValueByKey($this->response, 'mobilePhone');
+ }
+
+ public function getBusinessPhone(): ?string
+ {
+ return $this->getValueByKey($this->response, 'businessPhones.0');
+ }
+
+ public function toArray(): array
+ {
+ return $this->response;
+ }
+}
diff --git a/src/helpers/Provider.php b/src/helpers/Provider.php
index 5bd6d7b..7c26bd0 100644
--- a/src/helpers/Provider.php
+++ b/src/helpers/Provider.php
@@ -94,6 +94,7 @@ public static function getPrimaryColor(string $handle): ?string
'meneame' => '#ff6400',
'messenger' => '#0278ff',
'microsoft' => '#5e5e5e',
+ 'microsoftEntra' => '#5e5e5e',
'mix' => '#fd8334',
'mixCloud' => '#324259',
'myob' => '#6100a5',
@@ -339,6 +340,8 @@ public static function getIcon(string $handle): ?string
'messenger' => '',
'microsoft' => '',
+
+ 'microsoftEntra' => '',
'mix' => '',
diff --git a/src/providers/MicrosoftEntra.php b/src/providers/MicrosoftEntra.php
new file mode 100644
index 0000000..d05b698
--- /dev/null
+++ b/src/providers/MicrosoftEntra.php
@@ -0,0 +1,30 @@
+ (string)$token->getToken(),
+ ];
+ }
+}
\ No newline at end of file