Skip to content

Commit a69c17e

Browse files
fix(security): fix OIDC user identifier
Fixes #58941
1 parent cdfcf7d commit a69c17e

File tree

4 files changed

+14
-6
lines changed

4 files changed

+14
-6
lines changed

AccessToken/Oidc/OidcTokenHandler.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,11 @@ public function getUserBadgeFrom(string $accessToken): UserBadge
9292
}
9393

9494
// UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate
95-
return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn () => $this->createUser($claims)), $claims);
95+
return new UserBadge($claims[$this->claim], new FallbackUserLoader(function () use ($claims) {
96+
$claims['user_identifier'] = $claims[$this->claim];
97+
98+
return $this->createUser($claims);
99+
}), $claims);
96100
} catch (\Exception $e) {
97101
$this->logger?->error('An error occurred while decoding and validating the token.', [
98102
'error' => $e->getMessage(),

AccessToken/Oidc/OidcUserInfoTokenHandler.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ public function getUserBadgeFrom(string $accessToken): UserBadge
4747
}
4848

4949
// UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate
50-
return new UserBadge($claims[$this->claim], new FallbackUserLoader(fn () => $this->createUser($claims)), $claims);
50+
return new UserBadge($claims[$this->claim], new FallbackUserLoader(function () use ($claims) {
51+
$claims['user_identifier'] = $claims[$this->claim];
52+
53+
return $this->createUser($claims);
54+
}), $claims);
5155
} catch (\Exception $e) {
5256
$this->logger?->error('An error occurred on OIDC server.', [
5357
'error' => $e->getMessage(),

Tests/AccessToken/Oidc/OidcTokenHandlerTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public function testGetsUserIdentifierFromSignedToken(string $claim, string $exp
4747
'email' => '[email protected]',
4848
];
4949
$token = $this->buildJWS(json_encode($claims));
50-
$expectedUser = new OidcUser(...$claims);
50+
$expectedUser = new OidcUser(...$claims, userIdentifier: $claims[$claim]);
5151

5252
$loggerMock = $this->createMock(LoggerInterface::class);
5353
$loggerMock->expects($this->never())->method('error');
@@ -66,7 +66,7 @@ public function testGetsUserIdentifierFromSignedToken(string $claim, string $exp
6666
$this->assertInstanceOf(OidcUser::class, $actualUser);
6767
$this->assertEquals($expectedUser, $actualUser);
6868
$this->assertEquals($claims, $userBadge->getAttributes());
69-
$this->assertEquals($claims['sub'], $actualUser->getUserIdentifier());
69+
$this->assertEquals($claims[$claim], $actualUser->getUserIdentifier());
7070
}
7171

7272
public static function getClaims(): iterable

Tests/AccessToken/Oidc/OidcUserInfoTokenHandlerTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public function testGetsUserIdentifierFromOidcServerResponse(string $claim, stri
3333
'sub' => 'e21bf182-1538-406e-8ccb-e25a17aba39f',
3434
'email' => '[email protected]',
3535
];
36-
$expectedUser = new OidcUser(...$claims);
36+
$expectedUser = new OidcUser(...$claims, userIdentifier: $claims[$claim]);
3737

3838
$responseMock = $this->createMock(ResponseInterface::class);
3939
$responseMock->expects($this->once())
@@ -52,7 +52,7 @@ public function testGetsUserIdentifierFromOidcServerResponse(string $claim, stri
5252
$this->assertInstanceOf(OidcUser::class, $actualUser);
5353
$this->assertEquals($expectedUser, $actualUser);
5454
$this->assertEquals($claims, $userBadge->getAttributes());
55-
$this->assertEquals($claims['sub'], $actualUser->getUserIdentifier());
55+
$this->assertEquals($claims[$claim], $actualUser->getUserIdentifier());
5656
}
5757

5858
public static function getClaims(): iterable

0 commit comments

Comments
 (0)