From 75f8d36c6799a31ac23ea7f53d388691932f79c9 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 13 Dec 2022 12:32:31 -0800 Subject: [PATCH 01/18] Implements authorization view response contract that allows for being overridden with custom views --- src/Contracts/AuthorizationViewResponse.php | 10 +++ .../Controllers/AuthorizationController.php | 13 ++- .../Responses/AuthorizationViewResponse.php | 86 +++++++++++++++++++ src/Passport.php | 37 ++++++++ 4 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 src/Contracts/AuthorizationViewResponse.php create mode 100644 src/Http/Responses/AuthorizationViewResponse.php diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php new file mode 100644 index 000000000..dc83326f1 --- /dev/null +++ b/src/Contracts/AuthorizationViewResponse.php @@ -0,0 +1,10 @@ +withErrorHandling(function () use ($psrRequest) { return $this->server->validateAuthorizationRequest($psrRequest); @@ -109,6 +110,14 @@ public function authorize(ServerRequestInterface $psrRequest, $request->session()->put('authToken', $authToken = Str::random()); $request->session()->put('authRequest', $authRequest); + return app(AuthorizationViewResponse::class, [ + 'client' => $client, + 'user' => $user, + 'scopes' => $scopes, + 'request' => $request, + 'authToken' => $authToken, + ]); + return $this->response->view('passport::authorize', [ 'client' => $client, 'user' => $user, diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php new file mode 100644 index 000000000..d94458827 --- /dev/null +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -0,0 +1,86 @@ +view = $view; + $this->client = $client; + $this->user = $user; + $this->scopes = $scopes; + $this->request = $request; + $this->authToken = $authToken; + } + + /** + * Create an HTTP response that represents the object. + * + * @param \Illuminate\Http\Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function toResponse($request) + { + if (! is_callable($this->view) || is_string($this->view)) { + return view($this->view, ['request' => $request]); + } + + $response = call_user_func($this->view, $this->client, $this->user, $this->scopes, $this->request, $this->authToken); + + if ($response instanceof Responsable) { + return $response->toResponse($request); + } + + return $response; + } +} diff --git a/src/Passport.php b/src/Passport.php index 6e577ebea..06b6ae63d 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -6,6 +6,8 @@ use DateInterval; use DateTimeInterface; use Illuminate\Contracts\Encryption\Encrypter; +use Laravel\Passport\Contracts\AuthorizationViewResponse as AuthorizationViewResponseContract; +use Laravel\Passport\Http\Controllers\Responses\AuthorizationViewResponse; use League\OAuth2\Server\ResourceServer; use Mockery; use Psr\Http\Message\ServerRequestInterface; @@ -684,4 +686,39 @@ public static function withoutCookieSerialization() return new static; } + + /** + * Register the views for Passport using conventional names under the given namespace. + * + * @param string $namespace + * @return void + */ + public static function viewNamespace(string $namespace) + { + static::viewPrefix($namespace.'::'); + } + + /** + * Register the views for Passport using conventional names under the given prefix. + * + * @param string $prefix + * @return void + */ + public static function viewPrefix(string $prefix) + { + static::authorizationView($prefix.'authorize'); + } + + /** + * Specify which view should be used as the authorization view. + * + * @param callable|string $view + * @return void + */ + public static function authorizationView($view) + { + app()->singleton(AuthorizationViewResponseContract::class, function () use ($view) { + return new AuthorizationViewResponse($view); + }); + } } From 56c6b8e5a3e540a80f2656aeb6a18d75b74d7393 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 13 Dec 2022 13:05:06 -0800 Subject: [PATCH 02/18] Updated namespace --- src/Http/Responses/AuthorizationViewResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index d94458827..23d91913a 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -1,6 +1,6 @@ Date: Tue, 13 Dec 2022 13:09:15 -0800 Subject: [PATCH 03/18] Updated namespace --- src/Http/Responses/AuthorizationViewResponse.php | 4 +++- src/Passport.php | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 23d91913a..aff0a53ee 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -2,7 +2,9 @@ namespace Laravel\Passport\Http\Responses; -class AuthorizationViewResponse +use Laravel\Passport\Contracts\AuthorizationViewResponse as AuthorizationViewResponseContract; + +class AuthorizationViewResponse implements AuthorizationViewResponseContract { /** * The name of the view or the callable used to generate the view. diff --git a/src/Passport.php b/src/Passport.php index 06b6ae63d..527b31dba 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -7,7 +7,7 @@ use DateTimeInterface; use Illuminate\Contracts\Encryption\Encrypter; use Laravel\Passport\Contracts\AuthorizationViewResponse as AuthorizationViewResponseContract; -use Laravel\Passport\Http\Controllers\Responses\AuthorizationViewResponse; +use Laravel\Passport\Http\Responses\AuthorizationViewResponse; use League\OAuth2\Server\ResourceServer; use Mockery; use Psr\Http\Message\ServerRequestInterface; From 9b005f4de0482b25b729a49da891ccec7acec812 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 13 Dec 2022 13:28:14 -0800 Subject: [PATCH 04/18] Moved individual arguments to an array of parameters and one argument --- .../Responses/AuthorizationViewResponse.php | 45 +++---------------- src/Passport.php | 26 +---------- src/PassportServiceProvider.php | 4 +- 3 files changed, 11 insertions(+), 64 deletions(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index aff0a53ee..242588b41 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -14,40 +14,11 @@ class AuthorizationViewResponse implements AuthorizationViewResponseContract protected $view; /** - * The name of the view or the callable used to generate the view. - * - * @var string - */ - protected $client; - - /** - * The name of the view or the callable used to generate the view. - * - * @var string - */ - protected $user; - - /** - * The name of the view or the callable used to generate the view. + * An array of arguments that may be passed to the view response and used in the view. * * @var string */ - protected $scopes; - - /** - * The name of the view or the callable used to generate the view. - * - * @var string - */ - protected $request; - - /** - * The name of the view or the callable used to generate the view. - * - * @var string - */ - protected $authToken; - + protected $parameters; /** * Create a new response instance. @@ -55,14 +26,10 @@ class AuthorizationViewResponse implements AuthorizationViewResponseContract * @param callable|string $view * @return void */ - public function __construct($view, $client = null, $user = null, $scopes = null, $request = null, $authToken = null) + public function __construct($view, $parameters = array()) { $this->view = $view; - $this->client = $client; - $this->user = $user; - $this->scopes = $scopes; - $this->request = $request; - $this->authToken = $authToken; + $this->parameters = $parameters; } /** @@ -74,10 +41,10 @@ public function __construct($view, $client = null, $user = null, $scopes = null, public function toResponse($request) { if (! is_callable($this->view) || is_string($this->view)) { - return view($this->view, ['request' => $request]); + return view($this->view, $this->parameters); } - $response = call_user_func($this->view, $this->client, $this->user, $this->scopes, $this->request, $this->authToken); + $response = call_user_func($this->view, $this->parameters); if ($response instanceof Responsable) { return $response->toResponse($request); diff --git a/src/Passport.php b/src/Passport.php index 527b31dba..5cdc5ec51 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -687,28 +687,6 @@ public static function withoutCookieSerialization() return new static; } - /** - * Register the views for Passport using conventional names under the given namespace. - * - * @param string $namespace - * @return void - */ - public static function viewNamespace(string $namespace) - { - static::viewPrefix($namespace.'::'); - } - - /** - * Register the views for Passport using conventional names under the given prefix. - * - * @param string $prefix - * @return void - */ - public static function viewPrefix(string $prefix) - { - static::authorizationView($prefix.'authorize'); - } - /** * Specify which view should be used as the authorization view. * @@ -717,8 +695,8 @@ public static function viewPrefix(string $prefix) */ public static function authorizationView($view) { - app()->singleton(AuthorizationViewResponseContract::class, function () use ($view) { - return new AuthorizationViewResponse($view); + app()->singleton(AuthorizationViewResponseContract::class, function ($app, $parameters) use ($view) { + return new AuthorizationViewResponse($view, $parameters); }); } } diff --git a/src/PassportServiceProvider.php b/src/PassportServiceProvider.php index efe1361eb..f859c9414 100644 --- a/src/PassportServiceProvider.php +++ b/src/PassportServiceProvider.php @@ -145,10 +145,12 @@ public function register() $this->registerJWTParser(); $this->registerResourceServer(); $this->registerGuard(); + + Passport::authorizationView('passport::authorize'); } /** - * Register the authorization server. + * Register the authorization server.` * * @return void */ From d2a2955e30f3dfe1b0883a531e4e4689e5d8600d Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 13 Dec 2022 13:34:02 -0800 Subject: [PATCH 05/18] Removed authorize return type --- src/Http/Controllers/AuthorizationController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index 5270f9f45..9c4649e44 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -66,12 +66,12 @@ public function __construct(AuthorizationServer $server, * @param \Illuminate\Http\Request $request * @param \Laravel\Passport\ClientRepository $clients * @param \Laravel\Passport\TokenRepository $tokens - * @return \Laravel\Passport\Contracts\AuthorizationViewResponse + * @return \Laravel\Passport\Contracts\AuthorizationViewResponse|mixed|void */ public function authorize(ServerRequestInterface $psrRequest, Request $request, ClientRepository $clients, - TokenRepository $tokens): AuthorizationViewResponse + TokenRepository $tokens) { $authRequest = $this->withErrorHandling(function () use ($psrRequest) { return $this->server->validateAuthorizationRequest($psrRequest); From 061f2b3fe1dd187da5e2a94804d529d351ff9734 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 13 Dec 2022 13:34:32 -0800 Subject: [PATCH 06/18] Remove old return statement --- src/Http/Controllers/AuthorizationController.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index 9c4649e44..032f97265 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -117,14 +117,6 @@ public function authorize(ServerRequestInterface $psrRequest, 'request' => $request, 'authToken' => $authToken, ]); - - return $this->response->view('passport::authorize', [ - 'client' => $client, - 'user' => $user, - 'scopes' => $scopes, - 'request' => $request, - 'authToken' => $authToken, - ]); } /** From 8c570c6c4663e73734fec20d986fd374fc1b1612 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 14:32:34 -0700 Subject: [PATCH 07/18] Add IntelliJ IDE files to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 660fc15e4..cc31cac10 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ composer.lock /phpunit.xml .phpunit.result.cache +.idea From a101db4a7bd41470a7386f5f223a17238dab8d97 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 15:05:15 -0700 Subject: [PATCH 08/18] Formatting --- src/Contracts/AuthorizationViewResponse.php | 4 +- .../Controllers/AuthorizationController.php | 10 +- .../Responses/AuthorizationViewResponse.php | 92 +++++++++---------- src/Passport.php | 24 ++--- src/PassportServiceProvider.php | 2 +- 5 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index dc83326f1..845023b7a 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -6,5 +6,5 @@ interface AuthorizationViewResponse extends Responsable { - // -} \ No newline at end of file + // +} diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index 6c60900c9..b743e4084 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -111,11 +111,11 @@ public function authorize(ServerRequestInterface $psrRequest, $request->session()->put('authRequest', $authRequest); return app(AuthorizationViewResponse::class, [ - 'client' => $client, - 'user' => $user, - 'scopes' => $scopes, - 'request' => $request, - 'authToken' => $authToken, + 'client' => $client, + 'user' => $user, + 'scopes' => $scopes, + 'request' => $request, + 'authToken' => $authToken, ]); } diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 242588b41..7d8e20886 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -6,50 +6,50 @@ class AuthorizationViewResponse implements AuthorizationViewResponseContract { - /** - * The name of the view or the callable used to generate the view. - * - * @var string - */ - protected $view; - - /** - * An array of arguments that may be passed to the view response and used in the view. - * - * @var string - */ - protected $parameters; - - /** - * Create a new response instance. - * - * @param callable|string $view - * @return void - */ - public function __construct($view, $parameters = array()) - { - $this->view = $view; - $this->parameters = $parameters; - } - - /** - * Create an HTTP response that represents the object. - * - * @param \Illuminate\Http\Request $request - * @return \Symfony\Component\HttpFoundation\Response - */ - public function toResponse($request) - { - if (! is_callable($this->view) || is_string($this->view)) { - return view($this->view, $this->parameters); - } - - $response = call_user_func($this->view, $this->parameters); - - if ($response instanceof Responsable) { - return $response->toResponse($request); - } - - return $response; - } + /** + * The name of the view or the callable used to generate the view. + * + * @var string + */ + protected $view; + + /** + * An array of arguments that may be passed to the view response and used in the view. + * + * @var string + */ + protected $parameters; + + /** + * Create a new response instance. + * + * @param callable|string $view + * @return void + */ + public function __construct($view, $parameters = []) + { + $this->view = $view; + $this->parameters = $parameters; + } + + /** + * Create an HTTP response that represents the object. + * + * @param \Illuminate\Http\Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function toResponse($request) + { + if (! is_callable($this->view) || is_string($this->view)) { + return view($this->view, $this->parameters); + } + + $response = call_user_func($this->view, $this->parameters); + + if ($response instanceof Responsable) { + return $response->toResponse($request); + } + + return $response; + } } diff --git a/src/Passport.php b/src/Passport.php index 1db4e3d6a..0fdb7d260 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -718,16 +718,16 @@ public static function withoutCookieEncryption() return new static; } - /** - * Specify which view should be used as the authorization view. - * - * @param callable|string $view - * @return void - */ - public static function authorizationView($view) - { - app()->singleton(AuthorizationViewResponseContract::class, function ($app, $parameters) use ($view) { - return new AuthorizationViewResponse($view, $parameters); - }); - } + /** + * Specify which view should be used as the authorization view. + * + * @param callable|string $view + * @return void + */ + public static function authorizationView($view) + { + app()->singleton(AuthorizationViewResponseContract::class, function ($app, $parameters) use ($view) { + return new AuthorizationViewResponse($view, $parameters); + }); + } } diff --git a/src/PassportServiceProvider.php b/src/PassportServiceProvider.php index f859c9414..0fbf2605d 100644 --- a/src/PassportServiceProvider.php +++ b/src/PassportServiceProvider.php @@ -146,7 +146,7 @@ public function register() $this->registerResourceServer(); $this->registerGuard(); - Passport::authorizationView('passport::authorize'); + Passport::authorizationView('passport::authorize'); } /** From b9bc70a4fb231a031ea44292cc87fb1ef43c4fef Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 15:44:51 -0700 Subject: [PATCH 09/18] Update tests --- src/Contracts/AuthorizationViewResponse.php | 6 +++++- .../Controllers/AuthorizationController.php | 11 +++++----- .../Responses/AuthorizationViewResponse.php | 18 ++++++++++++++--- tests/Unit/AuthorizationControllerTest.php | 20 +++++++++---------- 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index 845023b7a..f58fc4853 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -6,5 +6,9 @@ interface AuthorizationViewResponse extends Responsable { - // + /** + * @param $parameters + * @return mixed + */ + public function withParameters($parameters = []); } diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index b743e4084..623bfb46f 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -4,7 +4,6 @@ use Illuminate\Auth\AuthenticationException; use Illuminate\Contracts\Auth\StatefulGuard; -use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; use Illuminate\Support\Str; use Laravel\Passport\Bridge\User; @@ -29,9 +28,9 @@ class AuthorizationController protected $server; /** - * The response factory implementation. + * The response implementation. * - * @var \Illuminate\Contracts\Routing\ResponseFactory + * @var \Laravel\Passport\Contracts\AuthorizationViewResponse */ protected $response; @@ -46,12 +45,12 @@ class AuthorizationController * Create a new controller instance. * * @param \League\OAuth2\Server\AuthorizationServer $server - * @param \Illuminate\Contracts\Routing\ResponseFactory $response + * @param \Laravel\Passport\Contracts\AuthorizationViewResponse $response * @param \Illuminate\Contracts\Auth\StatefulGuard $guard * @return void */ public function __construct(AuthorizationServer $server, - ResponseFactory $response, + AuthorizationViewResponse $response, StatefulGuard $guard) { $this->server = $server; @@ -110,7 +109,7 @@ public function authorize(ServerRequestInterface $psrRequest, $request->session()->put('authToken', $authToken = Str::random()); $request->session()->put('authRequest', $authRequest); - return app(AuthorizationViewResponse::class, [ + return $this->response->withParameters([ 'client' => $client, 'user' => $user, 'scopes' => $scopes, diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 7d8e20886..0e07e0b2b 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -26,10 +26,22 @@ class AuthorizationViewResponse implements AuthorizationViewResponseContract * @param callable|string $view * @return void */ - public function __construct($view, $parameters = []) + public function __construct($view) { $this->view = $view; + } + + /** + * Add parameters to response + * + * @param $parameters + * @return $this|mixed + */ + public function withParameters($parameters = []) + { $this->parameters = $parameters; + + return $this; } /** @@ -41,10 +53,10 @@ public function __construct($view, $parameters = []) public function toResponse($request) { if (! is_callable($this->view) || is_string($this->view)) { - return view($this->view, $this->parameters); + return view($this->view, ...$this->parameters); } - $response = call_user_func($this->view, $this->parameters); + $response = call_user_func($this->view, ...$this->parameters); if ($response instanceof Responsable) { return $response->toResponse($request); diff --git a/tests/Unit/AuthorizationControllerTest.php b/tests/Unit/AuthorizationControllerTest.php index 03f581913..9ecd8588b 100644 --- a/tests/Unit/AuthorizationControllerTest.php +++ b/tests/Unit/AuthorizationControllerTest.php @@ -10,6 +10,7 @@ use Laravel\Passport\ClientRepository; use Laravel\Passport\Exceptions\OAuthServerException; use Laravel\Passport\Http\Controllers\AuthorizationController; +use Laravel\Passport\Http\Responses\AuthorizationViewResponse; use Laravel\Passport\Passport; use Laravel\Passport\Token; use Laravel\Passport\TokenRepository; @@ -36,7 +37,7 @@ public function test_authorization_view_is_presented() ]); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -57,21 +58,20 @@ public function test_authorization_view_is_presented() $clients = m::mock(ClientRepository::class); $clients->shouldReceive('find')->with(1)->andReturn($client = m::mock(Client::class)); - $client->shouldReceive('skipsAuthorization')->andReturn(false); - $response->shouldReceive('view')->once()->andReturnUsing(function ($view, $data) use ($client, $user) { - $this->assertSame('passport::authorize', $view); + $tokens = m::mock(TokenRepository::class); + $tokens->shouldReceive('findValidToken')->with($user, $client)->andReturnNull(); + + $response->shouldReceive('withParameters')->once()->andReturnUsing(function ($data) use ($client, $user, $request) { $this->assertEquals($client, $data['client']); $this->assertEquals($user, $data['user']); + $this->assertEquals($request, $data['request']); $this->assertSame('description', $data['scopes'][0]->description); return 'view'; }); - $tokens = m::mock(TokenRepository::class); - $tokens->shouldReceive('findValidToken')->with($user, $client)->andReturnNull(); - $this->assertSame('view', $controller->authorize( m::mock(ServerRequestInterface::class), $request, $clients, $tokens )); @@ -207,7 +207,7 @@ public function test_authorization_view_is_presented_if_request_has_prompt_equal ]); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -234,10 +234,10 @@ public function test_authorization_view_is_presented_if_request_has_prompt_equal $tokens = m::mock(TokenRepository::class); $tokens->shouldNotReceive('findValidToken'); - $response->shouldReceive('view')->once()->andReturnUsing(function ($view, $data) use ($client, $user) { - $this->assertSame('passport::authorize', $view); + $response->shouldReceive('withParameters')->once()->andReturnUsing(function ($data) use ($client, $user, $request) { $this->assertEquals($client, $data['client']); $this->assertEquals($user, $data['user']); + $this->assertEquals($request, $data['request']); $this->assertSame('description', $data['scopes'][0]->description); return 'view'; From 7da24a2c8c35a08f0412c24f32d0595c3f263704 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 16:05:07 -0700 Subject: [PATCH 10/18] Update rest of tests with new response class --- src/Http/Responses/AuthorizationViewResponse.php | 1 + tests/Unit/AuthorizationControllerTest.php | 15 +++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 0e07e0b2b..2054d33e8 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -2,6 +2,7 @@ namespace Laravel\Passport\Http\Responses; +use Illuminate\Contracts\Support\Responsable; use Laravel\Passport\Contracts\AuthorizationViewResponse as AuthorizationViewResponseContract; class AuthorizationViewResponse implements AuthorizationViewResponseContract diff --git a/tests/Unit/AuthorizationControllerTest.php b/tests/Unit/AuthorizationControllerTest.php index 9ecd8588b..c42399300 100644 --- a/tests/Unit/AuthorizationControllerTest.php +++ b/tests/Unit/AuthorizationControllerTest.php @@ -3,7 +3,6 @@ namespace Laravel\Passport\Tests\Unit; use Illuminate\Contracts\Auth\StatefulGuard; -use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; use Laravel\Passport\Bridge\Scope; use Laravel\Passport\Client; @@ -80,7 +79,7 @@ public function test_authorization_view_is_presented() public function test_authorization_exceptions_are_handled() { $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -108,7 +107,7 @@ public function test_request_is_approved_if_valid_token_exists() ]); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -158,7 +157,7 @@ public function test_request_is_approved_if_client_can_skip_authorization() ]); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -257,7 +256,7 @@ public function test_authorization_denied_if_request_has_prompt_equals_to_none() ]); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -299,7 +298,7 @@ public function test_authorization_denied_if_request_has_prompt_equals_to_none() public function test_authorization_denied_if_unauthenticated_and_request_has_prompt_equals_to_none() { $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -340,7 +339,7 @@ public function test_logout_and_prompt_login_if_request_has_prompt_equals_to_log $this->expectException('Illuminate\Auth\AuthenticationException'); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); @@ -371,7 +370,7 @@ public function test_user_should_be_authenticated() $this->expectException('Illuminate\Auth\AuthenticationException'); $server = m::mock(AuthorizationServer::class); - $response = m::mock(ResponseFactory::class); + $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); $controller = new AuthorizationController($server, $response, $guard); From 39b07c1d48cb610fe8c45d22acc94a349d5906d7 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 16:18:34 -0700 Subject: [PATCH 11/18] Style fixes and make sure parameters pushed to authorization view are in an array. --- src/Http/Responses/AuthorizationViewResponse.php | 4 ++-- src/PassportServiceProvider.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 2054d33e8..c1278cae3 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -33,7 +33,7 @@ public function __construct($view) } /** - * Add parameters to response + * Add parameters to response. * * @param $parameters * @return $this|mixed @@ -54,7 +54,7 @@ public function withParameters($parameters = []) public function toResponse($request) { if (! is_callable($this->view) || is_string($this->view)) { - return view($this->view, ...$this->parameters); + return view($this->view, [...$this->parameters]); } $response = call_user_func($this->view, ...$this->parameters); diff --git a/src/PassportServiceProvider.php b/src/PassportServiceProvider.php index 0fbf2605d..64ed0b925 100644 --- a/src/PassportServiceProvider.php +++ b/src/PassportServiceProvider.php @@ -150,7 +150,7 @@ public function register() } /** - * Register the authorization server.` + * Register the authorization server. * * @return void */ From af62ae8dc484c7fbe572c822bdef243c040b93e8 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Wed, 8 Feb 2023 16:22:56 -0700 Subject: [PATCH 12/18] Remove parameters from authorization view function --- src/Passport.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Passport.php b/src/Passport.php index 0fdb7d260..f9473644f 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -726,8 +726,8 @@ public static function withoutCookieEncryption() */ public static function authorizationView($view) { - app()->singleton(AuthorizationViewResponseContract::class, function ($app, $parameters) use ($view) { - return new AuthorizationViewResponse($view, $parameters); + app()->singleton(AuthorizationViewResponseContract::class, function ($app) use ($view) { + return new AuthorizationViewResponse($view); }); } } From 4b0fbcbb7b04158a8a0ba6988fb6d7fe20255f3c Mon Sep 17 00:00:00 2001 From: Dries Vints Date: Thu, 9 Feb 2023 09:24:15 +0100 Subject: [PATCH 13/18] Update .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index cc31cac10..660fc15e4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ composer.lock /phpunit.xml .phpunit.result.cache -.idea From 56f5e9634b8b84892a12e269fedb0c6b13ec6572 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Mon, 13 Feb 2023 13:06:07 -0700 Subject: [PATCH 14/18] Update src/Contracts/AuthorizationViewResponse.php Co-authored-by: Choraimy Kroonstuiver <3661474+axlon@users.noreply.github.com> --- src/Contracts/AuthorizationViewResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index f58fc4853..fe14a285e 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -7,7 +7,7 @@ interface AuthorizationViewResponse extends Responsable { /** - * @param $parameters + * @param array $parameters * @return mixed */ public function withParameters($parameters = []); From 5994cd6b507a822e8b18cde8691561a447c2b6a7 Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Mon, 13 Feb 2023 13:07:38 -0700 Subject: [PATCH 15/18] Update src/Http/Responses/AuthorizationViewResponse.php Co-authored-by: Choraimy Kroonstuiver <3661474+axlon@users.noreply.github.com> --- src/Http/Responses/AuthorizationViewResponse.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index c1278cae3..9b2a6cf8e 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -36,7 +36,7 @@ public function __construct($view) * Add parameters to response. * * @param $parameters - * @return $this|mixed + * @return $this */ public function withParameters($parameters = []) { From b4e7cf22743dc9775916cb475a4cf42c2cba236d Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Tue, 14 Feb 2023 11:19:26 -0700 Subject: [PATCH 16/18] Updated doc block return types --- src/Contracts/AuthorizationViewResponse.php | 2 +- src/Http/Controllers/AuthorizationController.php | 2 +- src/Http/Responses/AuthorizationViewResponse.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index fe14a285e..560e3db57 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -8,7 +8,7 @@ interface AuthorizationViewResponse extends Responsable { /** * @param array $parameters - * @return mixed + * @return $this */ public function withParameters($parameters = []); } diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index 623bfb46f..209992d1e 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -65,7 +65,7 @@ public function __construct(AuthorizationServer $server, * @param \Illuminate\Http\Request $request * @param \Laravel\Passport\ClientRepository $clients * @param \Laravel\Passport\TokenRepository $tokens - * @return \Laravel\Passport\Contracts\AuthorizationViewResponse|mixed|void + * @return \Laravel\Passport\Contracts\AuthorizationViewResponse */ public function authorize(ServerRequestInterface $psrRequest, Request $request, diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index 9b2a6cf8e..cdf2980cb 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -35,7 +35,7 @@ public function __construct($view) /** * Add parameters to response. * - * @param $parameters + * @param array $parameters * @return $this */ public function withParameters($parameters = []) From 91bdd57a64eef39be787226ce70b85a86245aca5 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 16 Feb 2023 15:00:33 -0600 Subject: [PATCH 17/18] formatting --- src/Contracts/AuthorizationViewResponse.php | 3 +++ .../Controllers/AuthorizationController.php | 19 +++++++------- .../Responses/AuthorizationViewResponse.php | 4 +-- src/Passport.php | 26 +++++++++---------- tests/Unit/AuthorizationControllerTest.php | 18 ++++++------- 5 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index 560e3db57..312210909 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -7,6 +7,9 @@ interface AuthorizationViewResponse extends Responsable { /** + * Specify the parameters that should be passed to the view. + * + * * @param array $parameters * @return $this */ diff --git a/src/Http/Controllers/AuthorizationController.php b/src/Http/Controllers/AuthorizationController.php index 67422d79f..0c2bc6e8d 100644 --- a/src/Http/Controllers/AuthorizationController.php +++ b/src/Http/Controllers/AuthorizationController.php @@ -28,34 +28,33 @@ class AuthorizationController protected $server; /** - * The response implementation. + * The guard implementation. * - * @var \Laravel\Passport\Contracts\AuthorizationViewResponse + * @var \Illuminate\Contracts\Auth\StatefulGuard */ - protected $response; + protected $guard; /** - * The guard implementation. + * The authorization view response implementation. * - * @var \Illuminate\Contracts\Auth\StatefulGuard + * @var \Laravel\Passport\Contracts\AuthorizationViewResponse */ - protected $guard; + protected $response; /** * Create a new controller instance. * * @param \League\OAuth2\Server\AuthorizationServer $server - * @param \Laravel\Passport\Contracts\AuthorizationViewResponse $response * @param \Illuminate\Contracts\Auth\StatefulGuard $guard * @return void */ public function __construct(AuthorizationServer $server, - AuthorizationViewResponse $response, - StatefulGuard $guard) + StatefulGuard $guard, + AuthorizationViewResponse $response) { $this->server = $server; - $this->response = $response; $this->guard = $guard; + $this->response = $response; } /** diff --git a/src/Http/Responses/AuthorizationViewResponse.php b/src/Http/Responses/AuthorizationViewResponse.php index cdf2980cb..36761d486 100644 --- a/src/Http/Responses/AuthorizationViewResponse.php +++ b/src/Http/Responses/AuthorizationViewResponse.php @@ -54,10 +54,10 @@ public function withParameters($parameters = []) public function toResponse($request) { if (! is_callable($this->view) || is_string($this->view)) { - return view($this->view, [...$this->parameters]); + return response()->view($this->view, $this->parameters); } - $response = call_user_func($this->view, ...$this->parameters); + $response = call_user_func($this->view, $this->parameters); if ($response instanceof Responsable) { return $response->toResponse($request); diff --git a/src/Passport.php b/src/Passport.php index f9473644f..706a7543a 100644 --- a/src/Passport.php +++ b/src/Passport.php @@ -646,6 +646,19 @@ public static function tokenEncryptionKey(Encrypter $encrypter) $encrypter->getKey(); } + /** + * Specify which view should be used as the authorization view. + * + * @param callable|string $view + * @return void + */ + public static function authorizationView($view) + { + app()->singleton(AuthorizationViewResponseContract::class, function ($app) use ($view) { + return new AuthorizationViewResponse($view); + }); + } + /** * Configure Passport to not register its routes. * @@ -717,17 +730,4 @@ public static function withoutCookieEncryption() return new static; } - - /** - * Specify which view should be used as the authorization view. - * - * @param callable|string $view - * @return void - */ - public static function authorizationView($view) - { - app()->singleton(AuthorizationViewResponseContract::class, function ($app) use ($view) { - return new AuthorizationViewResponse($view); - }); - } } diff --git a/tests/Unit/AuthorizationControllerTest.php b/tests/Unit/AuthorizationControllerTest.php index 364573b1c..fe6e7f3ea 100644 --- a/tests/Unit/AuthorizationControllerTest.php +++ b/tests/Unit/AuthorizationControllerTest.php @@ -40,7 +40,7 @@ public function test_authorization_view_is_presented() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $guard->shouldReceive('user')->andReturn($user = m::mock()); @@ -83,7 +83,7 @@ public function test_authorization_exceptions_are_handled() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $server->shouldReceive('validateAuthorizationRequest')->andThrow(LeagueException::invalidCredentials()); @@ -111,7 +111,7 @@ public function test_request_is_approved_if_valid_token_exists() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $guard->shouldReceive('user')->andReturn($user = m::mock()); @@ -161,7 +161,7 @@ public function test_request_is_approved_if_client_can_skip_authorization() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $guard->shouldReceive('user')->andReturn($user = m::mock()); @@ -210,7 +210,7 @@ public function test_authorization_view_is_presented_if_request_has_prompt_equal $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $guard->shouldReceive('user')->andReturn($user = m::mock()); @@ -260,7 +260,7 @@ public function test_authorization_denied_if_request_has_prompt_equals_to_none() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $guard->shouldReceive('user')->andReturn($user = m::mock()); @@ -302,7 +302,7 @@ public function test_authorization_denied_if_unauthenticated_and_request_has_pro $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(true); $server->shouldReceive('validateAuthorizationRequest') @@ -343,7 +343,7 @@ public function test_logout_and_prompt_login_if_request_has_prompt_equals_to_log $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(false); $server->shouldReceive('validateAuthorizationRequest')->once(); @@ -374,7 +374,7 @@ public function test_user_should_be_authenticated() $response = m::mock(AuthorizationViewResponse::class); $guard = m::mock(StatefulGuard::class); - $controller = new AuthorizationController($server, $response, $guard); + $controller = new AuthorizationController($server, $guard, $response); $guard->shouldReceive('guest')->andReturn(true); $server->shouldReceive('validateAuthorizationRequest')->once(); From 254b425b05a40f257e4e344d4c317c37ecfbd6cf Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Thu, 16 Feb 2023 15:01:08 -0600 Subject: [PATCH 18/18] remove extra line --- src/Contracts/AuthorizationViewResponse.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Contracts/AuthorizationViewResponse.php b/src/Contracts/AuthorizationViewResponse.php index 312210909..6594c6624 100644 --- a/src/Contracts/AuthorizationViewResponse.php +++ b/src/Contracts/AuthorizationViewResponse.php @@ -9,7 +9,6 @@ interface AuthorizationViewResponse extends Responsable /** * Specify the parameters that should be passed to the view. * - * * @param array $parameters * @return $this */