Skip to content

Commit e560aa8

Browse files
authored
Merge pull request #1186 from laravel/revoke-refresh-tokens
[8.x] Revoke refresh tokens as well
2 parents 0920021 + e7876c6 commit e560aa8

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

src/Http/Controllers/AuthorizedAccessTokenController.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Http\Request;
66
use Illuminate\Http\Response;
7+
use Laravel\Passport\RefreshTokenRepository;
78
use Laravel\Passport\TokenRepository;
89

910
class AuthorizedAccessTokenController
@@ -15,15 +16,24 @@ class AuthorizedAccessTokenController
1516
*/
1617
protected $tokenRepository;
1718

19+
/**
20+
* The refresh token repository implementation.
21+
*
22+
* @var \Laravel\Passport\RefreshTokenRepository
23+
*/
24+
protected $refreshTokenRepository;
25+
1826
/**
1927
* Create a new controller instance.
2028
*
2129
* @param \Laravel\Passport\TokenRepository $tokenRepository
30+
* @param \Laravel\Passport\RefreshTokenRepository $refreshTokenRepository
2231
* @return void
2332
*/
24-
public function __construct(TokenRepository $tokenRepository)
33+
public function __construct(TokenRepository $tokenRepository, RefreshTokenRepository $refreshTokenRepository)
2534
{
2635
$this->tokenRepository = $tokenRepository;
36+
$this->refreshTokenRepository = $refreshTokenRepository;
2737
}
2838

2939
/**
@@ -60,6 +70,8 @@ public function destroy(Request $request, $tokenId)
6070

6171
$token->revoke();
6272

73+
$this->refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
74+
6375
return new Response('', Response::HTTP_NO_CONTENT);
6476
}
6577
}

src/RefreshTokenRepository.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,17 @@ public function revokeRefreshToken($id)
4848
return Passport::refreshToken()->where('id', $id)->update(['revoked' => true]);
4949
}
5050

51+
/**
52+
* Revokes refresh tokens by access token id.
53+
*
54+
* @param string $tokenId
55+
* @return void
56+
*/
57+
public function revokeRefreshTokensByAccessTokenId($tokenId)
58+
{
59+
Passport::refreshToken()->where('access_token_id', $tokenId)->update(['revoked' => true]);
60+
}
61+
5162
/**
5263
* Checks if the refresh token has been revoked.
5364
*

tests/AuthorizedAccessTokenControllerTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Illuminate\Http\Request;
66
use Laravel\Passport\Client;
77
use Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController;
8+
use Laravel\Passport\RefreshTokenRepository;
89
use Laravel\Passport\Token;
910
use Laravel\Passport\TokenRepository;
1011
use Mockery as m;
@@ -18,6 +19,11 @@ class AuthorizedAccessTokenControllerTest extends TestCase
1819
*/
1920
protected $tokenRepository;
2021

22+
/**
23+
* @var \Mockery\Mock|\Laravel\Passport\RefreshTokenRepository
24+
*/
25+
protected $refreshTokenRepository;
26+
2127
/**
2228
* @var AuthorizedAccessTokenController
2329
*/
@@ -26,7 +32,8 @@ class AuthorizedAccessTokenControllerTest extends TestCase
2632
protected function setUp(): void
2733
{
2834
$this->tokenRepository = m::mock(TokenRepository::class);
29-
$this->controller = new AuthorizedAccessTokenController($this->tokenRepository);
35+
$this->refreshTokenRepository = m::mock(RefreshTokenRepository::class);
36+
$this->controller = new AuthorizedAccessTokenController($this->tokenRepository, $this->refreshTokenRepository);
3037
}
3138

3239
protected function tearDown(): void
@@ -78,6 +85,7 @@ public function test_tokens_can_be_deleted()
7885
$token1->shouldReceive('revoke')->once();
7986

8087
$this->tokenRepository->shouldReceive('findForUser')->andReturn($token1);
88+
$this->refreshTokenRepository->shouldReceive('revokeRefreshTokensByAccessTokenId')->once();
8189

8290
$request->setUserResolver(function () {
8391
$user = m::mock();

0 commit comments

Comments
 (0)