From 90ea9c2ee49ed9d36d0a083d7a1c68bf96c79890 Mon Sep 17 00:00:00 2001 From: mainick Date: Mon, 5 Jan 2026 13:56:20 +0100 Subject: [PATCH 1/3] update symfony dependencies to support version 6.4 --- composer.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index aa86447..650ad6d 100644 --- a/composer.json +++ b/composer.json @@ -11,10 +11,10 @@ "require": { "php": ">=8.2", "stevenmaguire/oauth2-keycloak": "^5.1", - "symfony/routing": "^7.2", - "symfony/security-bundle": "^7.2", - "symfony/http-kernel": "^7.2", - "symfony/framework-bundle": "^7.2", + "symfony/routing": "^6.4 || ^7.2", + "symfony/security-bundle": "^6.4 || ^7.2", + "symfony/http-kernel": "^6.4 || ^7.2", + "symfony/framework-bundle": "^6.4 || ^7.2", "symfony/serializer-pack": "^1.3" }, "require-dev": { From 3de8fe3c52b21bbc283b67cee522cc09398419da Mon Sep 17 00:00:00 2001 From: mainick Date: Mon, 5 Jan 2026 13:57:04 +0100 Subject: [PATCH 2/3] fix problem with user count = 0: throw exception only response is empty or null, in case of "0" it mest returned. --- src/Service/Service.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/Service.php b/src/Service/Service.php index d47d1c7..6dbc99e 100644 --- a/src/Service/Service.php +++ b/src/Service/Service.php @@ -51,7 +51,7 @@ protected function executeQuery(string $path, string $returnType, ?Criteria $cri 'response' => $content, ]); - if (empty($content)) { + if ($content === '' || trim($content) === '') { throw new \UnexpectedValueException('Empty response'); } From 06e13d368ad2d39f954b9e4574bd8c30d5991997 Mon Sep 17 00:00:00 2001 From: mainick Date: Mon, 5 Jan 2026 13:57:21 +0100 Subject: [PATCH 3/3] feat: add userInfoRaw method to retrieve raw user data from token --- src/Interface/IamClientInterface.php | 2 ++ src/Provider/KeycloakClient.php | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/Interface/IamClientInterface.php b/src/Interface/IamClientInterface.php index 5675df8..f0f2c6c 100644 --- a/src/Interface/IamClientInterface.php +++ b/src/Interface/IamClientInterface.php @@ -15,6 +15,8 @@ public function verifyToken(AccessTokenInterface $token): ?UserRepresentationDTO public function userInfo(AccessTokenInterface $token): ?UserRepresentationDTO; + public function userInfoRaw(AccessTokenInterface $token): ?array; + public function fetchUserFromToken(AccessTokenInterface $token): ?KeycloakResourceOwner; /** diff --git a/src/Provider/KeycloakClient.php b/src/Provider/KeycloakClient.php index 4d066ab..8a8c55a 100644 --- a/src/Provider/KeycloakClient.php +++ b/src/Provider/KeycloakClient.php @@ -151,6 +151,33 @@ public function userInfo(AccessTokenInterface $token): ?UserRepresentationDTO } } + public function userInfoRaw(AccessTokenInterface $token): ?array + { + try { + $this->verifyToken($token); + $accessToken = new AccessTokenLib([ + 'access_token' => $token->getToken(), + 'refresh_token' => $token->getRefreshToken(), + 'expires' => $token->getExpires(), + 'values' => $token->getValues(), + ]); + $resourceOwner = $this->keycloakProvider->getResourceOwner($accessToken); + $user = new KeycloakResourceOwner($resourceOwner->toArray(), $token); + $this->keycloakClientLogger->info('KeycloakClient::userInfoRaw', [ + 'user' => $user->toArray(), + ]); + + return $user->toArray(); + } + catch (\Exception $e) { + $this->keycloakClientLogger->error('KeycloakClient::userInfoRaw', [ + 'error' => $e->getMessage(), + ]); + + return null; + } + } + public function fetchUserFromToken(AccessTokenInterface $token): ?KeycloakResourceOwner { try {