55namespace SimpleSAML \Module \oidc \Server \Grants ;
66
77use DateInterval ;
8+ use League \OAuth2 \Server \Grant \ImplicitGrant as OAuth2ImplicitGrant ;
89use League \OAuth2 \Server \RequestTypes \AuthorizationRequest as OAuth2AuthorizationRequest ;
910use League \OAuth2 \Server \ResponseTypes \RedirectResponse ;
1011use League \OAuth2 \Server \ResponseTypes \ResponseTypeInterface ;
1718use SimpleSAML \Module \oidc \Factories \Entities \AccessTokenEntityFactory ;
1819use SimpleSAML \Module \oidc \Repositories \Interfaces \AccessTokenRepositoryInterface ;
1920use SimpleSAML \Module \oidc \Server \Exceptions \OidcServerException ;
21+ use SimpleSAML \Module \oidc \Server \Grants \Interfaces \AuthorizationValidatableWithRequestRules ;
2022use SimpleSAML \Module \oidc \Server \Grants \Traits \IssueAccessTokenTrait ;
2123use SimpleSAML \Module \oidc \Server \RequestRules \Interfaces \ResultBagInterface ;
2224use SimpleSAML \Module \oidc \Server \RequestRules \RequestRulesManager ;
2325use SimpleSAML \Module \oidc \Server \RequestRules \Rules \AcrValuesRule ;
2426use SimpleSAML \Module \oidc \Server \RequestRules \Rules \AddClaimsToIdTokenRule ;
27+ use SimpleSAML \Module \oidc \Server \RequestRules \Rules \ClientIdRule ;
2528use SimpleSAML \Module \oidc \Server \RequestRules \Rules \MaxAgeRule ;
2629use SimpleSAML \Module \oidc \Server \RequestRules \Rules \PromptRule ;
30+ use SimpleSAML \Module \oidc \Server \RequestRules \Rules \RedirectUriRule ;
2731use SimpleSAML \Module \oidc \Server \RequestRules \Rules \RequestedClaimsRule ;
2832use SimpleSAML \Module \oidc \Server \RequestRules \Rules \RequestObjectRule ;
2933use SimpleSAML \Module \oidc \Server \RequestRules \Rules \RequiredNonceRule ;
3034use SimpleSAML \Module \oidc \Server \RequestRules \Rules \RequiredOpenIdScopeRule ;
3135use SimpleSAML \Module \oidc \Server \RequestRules \Rules \ResponseTypeRule ;
36+ use SimpleSAML \Module \oidc \Server \RequestRules \Rules \ScopeRule ;
37+ use SimpleSAML \Module \oidc \Server \RequestRules \Rules \StateRule ;
3238use SimpleSAML \Module \oidc \Server \RequestTypes \AuthorizationRequest ;
3339use SimpleSAML \Module \oidc \Services \IdTokenBuilder ;
3440use SimpleSAML \Module \oidc \Utils \RequestParamsResolver ;
3541use SimpleSAML \OpenID \Codebooks \HttpMethodsEnum ;
3642
37- class ImplicitGrant extends OAuth2ImplicitGrant
43+ /**
44+ * @psalm-suppress PropertyNotSetInConstructor
45+ */
46+ class ImplicitGrant extends OAuth2ImplicitGrant implements AuthorizationValidatableWithRequestRules
3847{
3948 use IssueAccessTokenTrait;
4049
@@ -49,14 +58,15 @@ class ImplicitGrant extends OAuth2ImplicitGrant
4958
5059 public function __construct (
5160 protected IdTokenBuilder $ idTokenBuilder ,
52- DateInterval $ accessTokenTTL ,
61+ protected DateInterval $ accessTokenTTL ,
5362 AccessTokenRepositoryInterface $ accessTokenRepository ,
54- RequestRulesManager $ requestRulesManager ,
63+ protected RequestRulesManager $ requestRulesManager ,
5564 protected RequestParamsResolver $ requestParamsResolver ,
56- string $ queryDelimiter ,
65+ protected string $ queryDelimiter ,
5766 AccessTokenEntityFactory $ accessTokenEntityFactory ,
5867 ) {
59- parent ::__construct ($ accessTokenTTL , $ queryDelimiter , $ requestRulesManager );
68+ parent ::__construct ($ accessTokenTTL , $ queryDelimiter );
69+
6070 $ this ->accessTokenRepository = $ accessTokenRepository ;
6171 $ this ->accessTokenEntityFactory = $ accessTokenEntityFactory ;
6272 }
@@ -108,14 +118,12 @@ public function completeAuthorizationRequest(
108118 * @throws \SimpleSAML\Module\oidc\Server\Exceptions\OidcServerException
109119 * @throws \Throwable
110120 */
111- public function validateAuthorizationRequestWithCheckerResultBag (
121+ public function validateAuthorizationRequestWithRequestRules (
112122 ServerRequestInterface $ request ,
113123 ResultBagInterface $ resultBag ,
114124 ): OAuth2AuthorizationRequest {
115- $ oAuth2AuthorizationRequest =
116- parent ::validateAuthorizationRequestWithCheckerResultBag ($ request , $ resultBag );
117-
118125 $ rulesToExecute = [
126+ ScopeRule::class,
119127 RequestObjectRule::class,
120128 PromptRule::class,
121129 MaxAgeRule::class,
@@ -129,14 +137,35 @@ public function validateAuthorizationRequestWithCheckerResultBag(
129137
130138 $ this ->requestRulesManager ->predefineResultBag ($ resultBag );
131139
140+ /** @var string $redirectUri */
141+ $ redirectUri = $ resultBag ->getOrFail (RedirectUriRule::class)->getValue ();
142+ /** @var string|null $state */
143+ $ state = $ resultBag ->getOrFail (StateRule::class)->getValue ();
144+ /** @var \SimpleSAML\Module\oidc\Entities\Interfaces\ClientEntityInterface $client */
145+ $ client = $ resultBag ->getOrFail (ClientIdRule::class)->getValue ();
146+
147+ // Some rules need certain things available in order to work properly...
148+ $ this ->requestRulesManager ->setData ('default_scope ' , $ this ->defaultScope );
149+ $ this ->requestRulesManager ->setData ('scope_delimiter_string ' , self ::SCOPE_DELIMITER_STRING );
150+
132151 $ resultBag = $ this ->requestRulesManager ->check (
133152 $ request ,
134153 $ rulesToExecute ,
135154 $ this ->shouldUseFragment (),
136155 $ this ->allowedAuthorizationHttpMethods ,
137156 );
138157
139- $ authorizationRequest = AuthorizationRequest::fromOAuth2AuthorizationRequest ($ oAuth2AuthorizationRequest );
158+ /** @var \League\OAuth2\Server\Entities\ScopeEntityInterface[] $scopes */
159+ $ scopes = $ resultBag ->getOrFail (ScopeRule::class)->getValue ();
160+
161+ $ authorizationRequest = new AuthorizationRequest ();
162+ $ authorizationRequest ->setClient ($ client );
163+ $ authorizationRequest ->setRedirectUri ($ redirectUri );
164+ $ authorizationRequest ->setScopes ($ scopes );
165+ $ authorizationRequest ->setGrantTypeId ($ this ->getIdentifier ());
166+ if ($ state !== null ) {
167+ $ authorizationRequest ->setState ($ state );
168+ }
140169
141170 // nonce existence is validated using a rule, so we can get it from there.
142171 $ authorizationRequest ->setNonce ((string )$ resultBag ->getOrFail (RequiredNonceRule::class)->getValue ());
0 commit comments