Skip to content

Commit d96323a

Browse files
authored
[13.x] Fix middleware type error (#1815)
* Fix middleware type error * Add middleware tests using transient token
1 parent 89eee72 commit d96323a

6 files changed

+60
-8
lines changed

src/Http/Middleware/CheckToken.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Laravel\Passport\Http\Middleware;
44

5-
use Laravel\Passport\AccessToken;
5+
use Laravel\Passport\Contracts\ScopeAuthorizable;
66
use Laravel\Passport\Exceptions\MissingScopeException;
77

88
class CheckToken extends ValidateToken
@@ -12,7 +12,7 @@ class CheckToken extends ValidateToken
1212
*
1313
* @throws \Laravel\Passport\Exceptions\MissingScopeException
1414
*/
15-
protected function validate(AccessToken $token, string ...$params): void
15+
protected function validate(ScopeAuthorizable $token, string ...$params): void
1616
{
1717
foreach ($params as $scope) {
1818
if ($token->cant($scope)) {

src/Http/Middleware/CheckTokenForAnyScope.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Laravel\Passport\Http\Middleware;
44

5-
use Laravel\Passport\AccessToken;
5+
use Laravel\Passport\Contracts\ScopeAuthorizable;
66
use Laravel\Passport\Exceptions\MissingScopeException;
77

88
class CheckTokenForAnyScope extends ValidateToken
@@ -12,7 +12,7 @@ class CheckTokenForAnyScope extends ValidateToken
1212
*
1313
* @throws \Laravel\Passport\Exceptions\MissingScopeException
1414
*/
15-
protected function validate(AccessToken $token, string ...$params): void
15+
protected function validate(ScopeAuthorizable $token, string ...$params): void
1616
{
1717
foreach ($params as $scope) {
1818
if ($token->can($scope)) {

src/Http/Middleware/EnsureClientIsResourceOwner.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Laravel\Passport\Http\Middleware;
44

55
use Laravel\Passport\AccessToken;
6+
use Laravel\Passport\Contracts\ScopeAuthorizable;
67
use Laravel\Passport\Exceptions\AuthenticationException;
78
use Laravel\Passport\Exceptions\MissingScopeException;
89

@@ -13,9 +14,13 @@ class EnsureClientIsResourceOwner extends ValidateToken
1314
*
1415
* @throws \Laravel\Passport\Exceptions\AuthenticationException|\Laravel\Passport\Exceptions\MissingScopeException
1516
*/
16-
protected function validate(AccessToken $token, string ...$params): void
17+
protected function validate(ScopeAuthorizable $token, string ...$params): void
1718
{
18-
if (! is_null($token->oauth_user_id) && $token->oauth_user_id !== $token->oauth_client_id) {
19+
if (
20+
$token instanceof AccessToken
21+
&& ! is_null($token->oauth_user_id)
22+
&& $token->oauth_user_id !== $token->oauth_client_id
23+
) {
1924
throw new AuthenticationException;
2025
}
2126

src/Http/Middleware/ValidateToken.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Closure;
66
use Illuminate\Http\Request;
77
use Laravel\Passport\AccessToken;
8+
use Laravel\Passport\Contracts\ScopeAuthorizable;
89
use Laravel\Passport\Exceptions\AuthenticationException;
910
use League\OAuth2\Server\Exception\OAuthServerException;
1011
use League\OAuth2\Server\ResourceServer;
@@ -54,7 +55,7 @@ public function handle(Request $request, Closure $next, string ...$params): Resp
5455
*
5556
* @throws \Laravel\Passport\Exceptions\AuthenticationException
5657
*/
57-
protected function validateToken(Request $request): AccessToken
58+
protected function validateToken(Request $request): ScopeAuthorizable
5859
{
5960
// If the user is authenticated and already has an access token set via
6061
// the token guard, there's no need to validate the request's bearer
@@ -80,5 +81,5 @@ protected function validateToken(Request $request): AccessToken
8081
/**
8182
* Validate the given access token.
8283
*/
83-
abstract protected function validate(AccessToken $token, string ...$params): void;
84+
abstract protected function validate(ScopeAuthorizable $token, string ...$params): void;
8485
}

tests/Unit/CheckTokenForAnyScopeTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
use Illuminate\Http\Request;
66
use Illuminate\Http\Response;
77
use Laravel\Passport\AccessToken;
8+
use Laravel\Passport\Contracts\OAuthenticatable;
89
use Laravel\Passport\Exceptions\AuthenticationException;
910
use Laravel\Passport\Http\Middleware\CheckTokenForAnyScope;
11+
use Laravel\Passport\TransientToken;
1012
use League\OAuth2\Server\Exception\OAuthServerException;
1113
use League\OAuth2\Server\ResourceServer;
1214
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
@@ -41,6 +43,27 @@ public function test_request_is_passed_along_if_token_is_valid()
4143
$this->assertSame('response', $response->getContent());
4244
}
4345

46+
public function test_request_is_passed_along_if_token_is_transient()
47+
{
48+
$user = m::mock(OAuthenticatable::class);
49+
$user->shouldReceive('currentAccessToken')->andReturn(new TransientToken());
50+
51+
$resourceServer = m::mock(ResourceServer::class);
52+
$resourceServer->shouldNotReceive('validateAuthenticatedRequest');
53+
54+
$middleware = new CheckTokenForAnyScope($resourceServer);
55+
56+
$request = Request::create('/');
57+
$request->headers->set('Authorization', 'Bearer token');
58+
$request->setUserResolver(fn () => $user);
59+
60+
$response = $middleware->handle($request, function () {
61+
return new Response('response');
62+
}, 'notfoo');
63+
64+
$this->assertSame('response', $response->getContent());
65+
}
66+
4467
public function test_request_is_passed_along_if_token_has_any_required_scope()
4568
{
4669
$resourceServer = m::mock(ResourceServer::class);

tests/Unit/CheckTokenTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
use Illuminate\Http\Request;
66
use Illuminate\Http\Response;
77
use Laravel\Passport\AccessToken;
8+
use Laravel\Passport\Contracts\OAuthenticatable;
89
use Laravel\Passport\Exceptions\AuthenticationException;
910
use Laravel\Passport\Http\Middleware\CheckToken;
11+
use Laravel\Passport\TransientToken;
1012
use League\OAuth2\Server\Exception\OAuthServerException;
1113
use League\OAuth2\Server\ResourceServer;
1214
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
@@ -41,6 +43,27 @@ public function test_request_is_passed_along_if_token_is_valid()
4143
$this->assertSame('response', $response->getContent());
4244
}
4345

46+
public function test_request_is_passed_along_if_token_is_transient()
47+
{
48+
$user = m::mock(OAuthenticatable::class);
49+
$user->shouldReceive('currentAccessToken')->andReturn(new TransientToken());
50+
51+
$resourceServer = m::mock(ResourceServer::class);
52+
$resourceServer->shouldNotReceive('validateAuthenticatedRequest');
53+
54+
$middleware = new CheckToken($resourceServer);
55+
56+
$request = Request::create('/');
57+
$request->headers->set('Authorization', 'Bearer token');
58+
$request->setUserResolver(fn () => $user);
59+
60+
$response = $middleware->handle($request, function () {
61+
return new Response('response');
62+
});
63+
64+
$this->assertSame('response', $response->getContent());
65+
}
66+
4467
public function test_request_is_passed_along_if_token_and_scope_are_valid()
4568
{
4669
$resourceServer = m::mock(ResourceServer::class);

0 commit comments

Comments
 (0)