4
4
5
5
namespace App \Security \Http \AccessToken \Oidc ;
6
6
7
+ use Jose \Component \Checker \ClaimCheckerManager ;
8
+ use Jose \Component \Checker \HeaderCheckerManager ;
7
9
use Jose \Component \Core \JWKSet ;
8
10
use Jose \Component \Signature \JWSLoader ;
9
11
use Psr \Log \LoggerInterface ;
10
12
use Symfony \Component \DependencyInjection \Attribute \Autowire ;
11
13
use Symfony \Component \Security \Core \Exception \BadCredentialsException ;
12
14
use Symfony \Component \Security \Http \AccessToken \AccessTokenHandlerInterface ;
13
- use Symfony \Component \Security \Http \AccessToken \Oidc \Exception \MissingClaimException ;
14
15
use Symfony \Component \Security \Http \AccessToken \Oidc \OidcTokenHandler ;
15
16
use Symfony \Component \Security \Http \AccessToken \Oidc \OidcTrait ;
16
17
use Symfony \Component \Security \Http \Authenticator \FallbackUserLoader ;
21
22
22
23
/**
23
24
* Completes {@see OidcTokenHandler} with OIDC Discovery and configuration stored in cache.
25
+ * It verifies access tokens, extracts user information, and creates user badges for Symfony's security system.
26
+ *
27
+ * @see https://github.com/symfony/symfony/pull/54932
24
28
*/
25
- final class OidcDiscoveryTokenHandler implements AccessTokenHandlerInterface
29
+ final readonly class OidcDiscoveryTokenHandler implements AccessTokenHandlerInterface
26
30
{
27
31
use OidcTrait;
28
32
@@ -31,7 +35,11 @@ public function __construct(
31
35
private CacheInterface $ cache ,
32
36
#[Autowire('@jose.jws_loader.oidc ' )]
33
37
private JWSLoader $ jwsLoader ,
34
- private readonly HttpClientInterface $ securityAuthorizationClient ,
38
+ #[Autowire('@jose.claim_checker.oidc ' )]
39
+ private ClaimCheckerManager $ claimCheckerManager ,
40
+ #[Autowire('@jose.header_checker.oidc ' )]
41
+ private HeaderCheckerManager $ headerCheckerManager ,
42
+ private HttpClientInterface $ securityAuthorizationClient ,
35
43
private string $ claim = 'email ' ,
36
44
private int $ ttl = 600 ,
37
45
private ?LoggerInterface $ logger = null ,
@@ -86,9 +94,8 @@ public function getUserBadgeFrom(string $accessToken): UserBadge
86
94
);
87
95
88
96
$ claims = json_decode ($ jws ->getPayload (), true );
89
- if (empty ($ claims [$ this ->claim ])) {
90
- throw new MissingClaimException (\sprintf ('"%s" claim not found. ' , $ this ->claim ));
91
- }
97
+ $ this ->claimCheckerManager ->check (claims: $ claims , mandatoryClaims: [$ this ->claim ]);
98
+ $ this ->headerCheckerManager ->check (jwt: $ jws , index: 0 );
92
99
93
100
// UserLoader argument can be overridden by a UserProvider on AccessTokenAuthenticator::authenticate
94
101
return new UserBadge ($ claims [$ this ->claim ], new FallbackUserLoader (fn () => $ this ->createUser ($ claims )), $ claims );
0 commit comments