Skip to content

Commit 5ab8904

Browse files
[13.x] Disable PAT requests (#1766)
* [13.x] disable PAT request * add test * add assertion * fix tests * revert unnecessary change * remove redundant tokenRepository injection * formatting * Update ClientFactory.php * Update ClientFactory.php --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent ba3ec9d commit 5ab8904

File tree

4 files changed

+73
-21
lines changed

4 files changed

+73
-21
lines changed

database/factories/ClientFactory.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public function definition()
4040
}
4141

4242
/**
43-
* Use as Password Client.
43+
* Use as a Password client.
4444
*
4545
* @return $this
4646
*/
@@ -53,7 +53,20 @@ public function asPasswordClient()
5353
}
5454

5555
/**
56-
* Use as Client Credentials.
56+
* Use as a Personal Access Token client.
57+
*
58+
* @return $this
59+
*/
60+
public function asPersonalAccessTokenClient()
61+
{
62+
return $this->state([
63+
'personal_access_client' => true,
64+
'password_client' => false,
65+
]);
66+
}
67+
68+
/**
69+
* Use as a Client Credentials client.
5770
*
5871
* @return $this
5972
*/

src/Http/Controllers/AccessTokenController.php

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

33
namespace Laravel\Passport\Http\Controllers;
44

5-
use Laravel\Passport\TokenRepository;
65
use League\OAuth2\Server\AuthorizationServer;
6+
use League\OAuth2\Server\Exception\OAuthServerException;
77
use Nyholm\Psr7\Response as Psr7Response;
88
use Psr\Http\Message\ServerRequestInterface;
99

@@ -18,25 +18,15 @@ class AccessTokenController
1818
*/
1919
protected $server;
2020

21-
/**
22-
* The token repository instance.
23-
*
24-
* @var \Laravel\Passport\TokenRepository
25-
*/
26-
protected $tokens;
27-
2821
/**
2922
* Create a new controller instance.
3023
*
3124
* @param \League\OAuth2\Server\AuthorizationServer $server
32-
* @param \Laravel\Passport\TokenRepository $tokens
3325
* @return void
3426
*/
35-
public function __construct(AuthorizationServer $server,
36-
TokenRepository $tokens)
27+
public function __construct(AuthorizationServer $server)
3728
{
3829
$this->server = $server;
39-
$this->tokens = $tokens;
4030
}
4131

4232
/**
@@ -48,6 +38,11 @@ public function __construct(AuthorizationServer $server,
4838
public function issueToken(ServerRequestInterface $request)
4939
{
5040
return $this->withErrorHandling(function () use ($request) {
41+
if (array_key_exists('grant_type', $attributes = (array) $request->getParsedBody())
42+
&& $attributes['grant_type'] === 'personal_access') {
43+
throw OAuthServerException::unsupportedGrantType();
44+
}
45+
5146
return $this->convertResponse(
5247
$this->server->respondToAccessTokenRequest($request, new Psr7Response)
5348
);

tests/Feature/AccessTokenControllerTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,49 @@ public function testGettingCustomResponseType()
269269
$this->assertArrayHasKey('id_token', $decodedResponse);
270270
$this->assertSame('foo_bar_open_id_token', $decodedResponse['id_token']);
271271
}
272+
273+
public function testPersonalAccessTokenRequestIsDisabled()
274+
{
275+
$user = UserFactory::new()->create([
276+
'email' => '[email protected]',
277+
'password' => $this->app->make(Hasher::class)->make('foobar123'),
278+
]);
279+
280+
/** @var Client $client */
281+
$client = ClientFactory::new()->asPersonalAccessTokenClient()->create();
282+
283+
config([
284+
'passport.personal_access_client.id' => $client->getKey(),
285+
'passport.personal_access_client.secret' => $client->plainSecret,
286+
]);
287+
288+
$response = $this->post(
289+
'/oauth/token',
290+
[
291+
'grant_type' => 'personal_access',
292+
'client_id' => $client->getKey(),
293+
'client_secret' => $client->plainSecret,
294+
'user_id' => $user->getKey(),
295+
'scope' => '',
296+
]
297+
);
298+
299+
$response->assertStatus(400);
300+
301+
$decodedResponse = $response->decodeResponseJson()->json();
302+
303+
$this->assertArrayNotHasKey('token_type', $decodedResponse);
304+
$this->assertArrayNotHasKey('expires_in', $decodedResponse);
305+
$this->assertArrayNotHasKey('access_token', $decodedResponse);
306+
307+
$this->assertArrayHasKey('error', $decodedResponse);
308+
$this->assertSame('unsupported_grant_type', $decodedResponse['error']);
309+
$this->assertArrayHasKey('error_description', $decodedResponse);
310+
311+
$token = $user->createToken('test');
312+
313+
$this->assertInstanceOf(\Laravel\Passport\PersonalAccessTokenResult::class, $token);
314+
}
272315
}
273316

274317
class IdTokenResponse extends \League\OAuth2\Server\ResponseTypes\BearerTokenResponse

tests/Unit/AccessTokenControllerTest.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Laravel\Passport\Exceptions\OAuthServerException;
66
use Laravel\Passport\Http\Controllers\AccessTokenController;
7-
use Laravel\Passport\TokenRepository;
87
use League\OAuth2\Server\AuthorizationServer;
98
use League\OAuth2\Server\Exception\OAuthServerException as LeagueException;
109
use Mockery as m;
@@ -23,8 +22,9 @@ protected function tearDown(): void
2322
public function test_a_token_can_be_issued()
2423
{
2524
$request = m::mock(ServerRequestInterface::class);
25+
$request->shouldReceive('getParsedBody')->once()->andReturn([]);
26+
2627
$response = m::type(ResponseInterface::class);
27-
$tokens = m::mock(TokenRepository::class);
2828

2929
$psrResponse = new Response();
3030
$psrResponse->getBody()->write(json_encode(['access_token' => 'access-token']));
@@ -34,25 +34,26 @@ public function test_a_token_can_be_issued()
3434
->with($request, $response)
3535
->andReturn($psrResponse);
3636

37-
$controller = new AccessTokenController($server, $tokens);
37+
$controller = new AccessTokenController($server);
3838

3939
$this->assertSame('{"access_token":"access-token"}', $controller->issueToken($request)->getContent());
4040
}
4141

4242
public function test_exceptions_are_handled()
4343
{
44-
$tokens = m::mock(TokenRepository::class);
44+
$request = m::mock(ServerRequestInterface::class);
45+
$request->shouldReceive('getParsedBody')->once()->andReturn([]);
4546

4647
$server = m::mock(AuthorizationServer::class);
4748
$server->shouldReceive('respondToAccessTokenRequest')->with(
48-
m::type(ServerRequestInterface::class), m::type(ResponseInterface::class)
49+
$request, m::type(ResponseInterface::class)
4950
)->andThrow(LeagueException::invalidCredentials());
5051

51-
$controller = new AccessTokenController($server, $tokens);
52+
$controller = new AccessTokenController($server);
5253

5354
$this->expectException(OAuthServerException::class);
5455

55-
$controller->issueToken(m::mock(ServerRequestInterface::class));
56+
$controller->issueToken($request);
5657
}
5758
}
5859

0 commit comments

Comments
 (0)