22
33namespace Laravel \Passport \Http \Controllers ;
44
5+ use Illuminate \Auth \AuthenticationException ;
6+ use Illuminate \Contracts \Auth \StatefulGuard ;
57use Illuminate \Contracts \Routing \ResponseFactory ;
68use Illuminate \Http \Request ;
79use Illuminate \Support \Str ;
1012use Laravel \Passport \Passport ;
1113use Laravel \Passport \TokenRepository ;
1214use League \OAuth2 \Server \AuthorizationServer ;
15+ use League \OAuth2 \Server \Exception \OAuthServerException ;
1316use Nyholm \Psr7 \Response as Psr7Response ;
1417use Psr \Http \Message \ServerRequestInterface ;
1518
@@ -31,17 +34,28 @@ class AuthorizationController
3134 */
3235 protected $ response ;
3336
37+ /**
38+ * The guard implementation.
39+ *
40+ * @var \Illuminate\Contracts\Auth\StatefulGuard
41+ */
42+ protected $ guard ;
43+
3444 /**
3545 * Create a new controller instance.
3646 *
3747 * @param \League\OAuth2\Server\AuthorizationServer $server
3848 * @param \Illuminate\Contracts\Routing\ResponseFactory $response
49+ * @param \Illuminate\Contracts\Auth\StatefulGuard $guard
3950 * @return void
4051 */
41- public function __construct (AuthorizationServer $ server , ResponseFactory $ response )
52+ public function __construct (AuthorizationServer $ server ,
53+ ResponseFactory $ response ,
54+ StatefulGuard $ guard )
4255 {
4356 $ this ->server = $ server ;
4457 $ this ->response = $ response ;
58+ $ this ->guard = $ guard ;
4559 }
4660
4761 /**
@@ -62,6 +76,23 @@ public function authorize(ServerRequestInterface $psrRequest,
6276 return $ this ->server ->validateAuthorizationRequest ($ psrRequest );
6377 });
6478
79+ if ($ this ->guard ->guest ()) {
80+ return $ request ->get ('prompt ' ) === 'none '
81+ ? $ this ->denyRequest ($ authRequest )
82+ : $ this ->promptForLogin ($ request );
83+ }
84+
85+ if ($ request ->get ('prompt ' ) === 'login ' &&
86+ ! $ request ->session ()->get ('promptedForLogin ' , false )) {
87+ $ this ->guard ->logout ();
88+ $ request ->session ()->invalidate ();
89+ $ request ->session ()->regenerateToken ();
90+
91+ return $ this ->promptForLogin ($ request );
92+ }
93+
94+ $ request ->session ()->forget ('promptedForLogin ' );
95+
6596 $ scopes = $ this ->parseScopes ($ authRequest );
6697 $ user = $ request ->user ();
6798 $ client = $ clients ->find ($ authRequest ->getClient ()->getIdentifier ());
@@ -142,11 +173,26 @@ protected function approveRequest($authRequest, $user)
142173 * Deny the authorization request.
143174 *
144175 * @param \League\OAuth2\Server\RequestTypes\AuthorizationRequest $authRequest
145- * @param \Illuminate\Database\Eloquent\Model $user
176+ * @param \Illuminate\Database\Eloquent\Model|null $user
146177 * @return \Illuminate\Http\Response
147178 */
148- protected function denyRequest ($ authRequest , $ user )
179+ protected function denyRequest ($ authRequest , $ user = null )
149180 {
181+ if (is_null ($ user )) {
182+ $ uri = $ authRequest ->getRedirectUri ()
183+ ?? (is_array ($ authRequest ->getClient ()->getRedirectUri ())
184+ ? $ authRequest ->getClient ()->getRedirectUri ()[0 ]
185+ : $ authRequest ->getClient ()->getRedirectUri ());
186+
187+ $ separator = $ authRequest ->getGrantTypeId () === 'implicit ' ? '# ' : '? ' ;
188+
189+ $ uri = $ uri .(str_contains ($ uri , $ separator ) ? '& ' : $ separator ).'state= ' .$ authRequest ->getState ();
190+
191+ return $ this ->withErrorHandling (function () use ($ uri ) {
192+ throw OAuthServerException::accessDenied ('Unauthenticated ' , $ uri );
193+ });
194+ }
195+
150196 $ authRequest ->setUser (new User ($ user ->getAuthIdentifier ()));
151197
152198 $ authRequest ->setAuthorizationApproved (false );
@@ -157,4 +203,18 @@ protected function denyRequest($authRequest, $user)
157203 );
158204 });
159205 }
206+
207+ /**
208+ * Prompt the user to login by throwing an AuthenticationException.
209+ *
210+ * @param \Illuminate\Http\Request $request
211+ *
212+ * @throws \Illuminate\Auth\AuthenticationException
213+ */
214+ protected function promptForLogin ($ request )
215+ {
216+ $ request ->session ()->put ('promptedForLogin ' , true );
217+
218+ throw new AuthenticationException ;
219+ }
160220}
0 commit comments