Skip to content

Commit ef122ad

Browse files
[13.x] Deprecate JSON API (#1778)
* deprecate json api * wip * upgrade guide * wip * wip * wip * fix tests * formatting * wip * fix bugs * formatting * upgrade guide * Update UPGRADE.md --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent 40c4b91 commit ef122ad

16 files changed

+235
-476
lines changed

Diff for: UPGRADE.md

+11
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ Passport's `oauth_personal_access_clients` table has been redundant and unnecess
8484

8585
In addition, the `passport.personal_access_client` configuration value, `Laravel\Passport\PersonalAccessClient` model, `Passport::$personalAccessClientModel` property, `Passport::usePersonalAccessClientModel()`, `Passport::personalAccessClientModel()`, and `Passport::personalAccessClient()` methods have been removed.
8686

87+
### JSON API Deprecation
88+
89+
PR: https://github.com/laravel/passport/pull/1778
90+
91+
The JSON API provided by Passport has been deprecated. If you need to continue using the deprecated JSON API, you can do so by setting `Passport::$registersJsonApiRoutes` to `true` within the `boot` method of your application’s `App\Providers\AppServiceProvider` class. Alternatively, you may also copy the relevant routes and controllers into your application as needed:
92+
93+
public function boot(): void
94+
{
95+
Passport::$registersJsonApiRoutes = true;
96+
}
97+
8798
## Upgrading To 12.0 From 11.x
8899

89100
### Migration Changes

Diff for: routes/web.php

+52-49
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22

33
use Illuminate\Support\Facades\Route;
4+
use Laravel\Passport\Passport;
45

56
Route::post('/token', [
67
'uses' => 'AccessTokenController@issueToken',
@@ -32,53 +33,55 @@
3233
'as' => 'authorizations.deny',
3334
]);
3435

35-
Route::get('/tokens', [
36-
'uses' => 'AuthorizedAccessTokenController@forUser',
37-
'as' => 'tokens.index',
38-
]);
39-
40-
Route::delete('/tokens/{token_id}', [
41-
'uses' => 'AuthorizedAccessTokenController@destroy',
42-
'as' => 'tokens.destroy',
43-
]);
44-
45-
Route::get('/clients', [
46-
'uses' => 'ClientController@forUser',
47-
'as' => 'clients.index',
48-
]);
49-
50-
Route::post('/clients', [
51-
'uses' => 'ClientController@store',
52-
'as' => 'clients.store',
53-
]);
54-
55-
Route::put('/clients/{client_id}', [
56-
'uses' => 'ClientController@update',
57-
'as' => 'clients.update',
58-
]);
59-
60-
Route::delete('/clients/{client_id}', [
61-
'uses' => 'ClientController@destroy',
62-
'as' => 'clients.destroy',
63-
]);
64-
65-
Route::get('/scopes', [
66-
'uses' => 'ScopeController@all',
67-
'as' => 'scopes.index',
68-
]);
69-
70-
Route::get('/personal-access-tokens', [
71-
'uses' => 'PersonalAccessTokenController@forUser',
72-
'as' => 'personal.tokens.index',
73-
]);
74-
75-
Route::post('/personal-access-tokens', [
76-
'uses' => 'PersonalAccessTokenController@store',
77-
'as' => 'personal.tokens.store',
78-
]);
79-
80-
Route::delete('/personal-access-tokens/{token_id}', [
81-
'uses' => 'PersonalAccessTokenController@destroy',
82-
'as' => 'personal.tokens.destroy',
83-
]);
36+
if (Passport::$registersJsonApiRoutes) {
37+
Route::get('/tokens', [
38+
'uses' => 'AuthorizedAccessTokenController@forUser',
39+
'as' => 'tokens.index',
40+
]);
41+
42+
Route::delete('/tokens/{token_id}', [
43+
'uses' => 'AuthorizedAccessTokenController@destroy',
44+
'as' => 'tokens.destroy',
45+
]);
46+
47+
Route::get('/clients', [
48+
'uses' => 'ClientController@forUser',
49+
'as' => 'clients.index',
50+
]);
51+
52+
Route::post('/clients', [
53+
'uses' => 'ClientController@store',
54+
'as' => 'clients.store',
55+
]);
56+
57+
Route::put('/clients/{client_id}', [
58+
'uses' => 'ClientController@update',
59+
'as' => 'clients.update',
60+
]);
61+
62+
Route::delete('/clients/{client_id}', [
63+
'uses' => 'ClientController@destroy',
64+
'as' => 'clients.destroy',
65+
]);
66+
67+
Route::get('/scopes', [
68+
'uses' => 'ScopeController@all',
69+
'as' => 'scopes.index',
70+
]);
71+
72+
Route::get('/personal-access-tokens', [
73+
'uses' => 'PersonalAccessTokenController@forUser',
74+
'as' => 'personal.tokens.index',
75+
]);
76+
77+
Route::post('/personal-access-tokens', [
78+
'uses' => 'PersonalAccessTokenController@store',
79+
'as' => 'personal.tokens.store',
80+
]);
81+
82+
Route::delete('/personal-access-tokens/{token_id}', [
83+
'uses' => 'PersonalAccessTokenController@destroy',
84+
'as' => 'personal.tokens.destroy',
85+
]);
86+
}
8487
});

Diff for: src/ClientRepository.php

+20-46
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Contracts\Auth\Authenticatable;
66
use Illuminate\Database\Eloquent\Builder;
7+
use Illuminate\Database\Eloquent\Collection;
78
use Illuminate\Support\Str;
89
use RuntimeException;
910

@@ -30,44 +31,26 @@ public function findActive(string|int $id): ?Client
3031
/**
3132
* Get a client instance for the given ID and user ID.
3233
*
33-
* @param int|string $clientId
34-
* @param mixed $userId
35-
* @return \Laravel\Passport\Client|null
34+
* @deprecated Use $user->clients()->find()
35+
*
36+
* @param \Laravel\Passport\HasApiTokens $user
3637
*/
37-
public function findForUser($clientId, $userId)
38+
public function findForUser(string|int $clientId, Authenticatable $user): ?Client
3839
{
39-
$client = Passport::client();
40-
41-
return $client
42-
->where($client->getKeyName(), $clientId)
43-
->where('user_id', $userId)
44-
->first();
40+
return $user->clients()->where('revoked', false)->find($clientId);
4541
}
4642

4743
/**
4844
* Get the client instances for the given user ID.
4945
*
50-
* @param mixed $userId
51-
* @return \Illuminate\Database\Eloquent\Collection
52-
*/
53-
public function forUser($userId)
54-
{
55-
return Passport::client()
56-
->where('user_id', $userId)
57-
->orderBy('name', 'asc')->get();
58-
}
59-
60-
/**
61-
* Get the active client instances for the given user ID.
46+
* @deprecated Use $user->clients()
6247
*
63-
* @param mixed $userId
64-
* @return \Illuminate\Database\Eloquent\Collection
48+
* @param \Laravel\Passport\HasApiTokens $user
49+
* @return \Illuminate\Database\Eloquent\Collection<int, \Laravel\Passport\Client>
6550
*/
66-
public function activeForUser($userId)
51+
public function forUser(Authenticatable $user): Collection
6752
{
68-
return $this->forUser($userId)->reject(function ($client) {
69-
return $client->revoked;
70-
})->values();
53+
return $user->clients()->where('revoked', false)->orderBy('name')->get();
7154
}
7255

7356
/*
@@ -188,6 +171,8 @@ public function createAuthorizationCodeGrantClient(
188171
/**
189172
* Update the given client.
190173
*
174+
* @deprecated Will be removed in a future Laravel version.
175+
*
191176
* @param string[] $redirectUris
192177
*/
193178
public function update(Client $client, string $name, array $redirectUris): bool
@@ -215,27 +200,16 @@ public function regenerateSecret(Client $client): bool
215200
}
216201

217202
/**
218-
* Determine if the given client is revoked.
219-
*
220-
* @param int|string $id
221-
* @return bool
222-
*/
223-
public function revoked($id)
224-
{
225-
$client = $this->find($id);
226-
227-
return is_null($client) || $client->revoked;
228-
}
229-
230-
/**
231-
* Delete the given client.
203+
* Revoke the given client and its tokens.
232204
*
233-
* @param \Laravel\Passport\Client $client
234-
* @return void
205+
* @deprecated Will be removed in a future Laravel version.
235206
*/
236-
public function delete(Client $client)
207+
public function delete(Client $client): void
237208
{
238-
$client->tokens()->update(['revoked' => true]);
209+
$client->tokens()->with('refreshToken')->each(function (Token $token): void {
210+
$token->refreshToken?->revoke();
211+
$token->revoke();
212+
});
239213

240214
$client->forceFill(['revoked' => true])->save();
241215
}

Diff for: src/Http/Controllers/AuthorizedAccessTokenController.php

+16-39
Original file line numberDiff line numberDiff line change
@@ -2,75 +2,52 @@
22

33
namespace Laravel\Passport\Http\Controllers;
44

5+
use Illuminate\Database\Eloquent\Collection;
56
use Illuminate\Http\Request;
67
use Illuminate\Http\Response;
7-
use Laravel\Passport\RefreshTokenRepository;
8+
use Laravel\Passport\Token;
89
use Laravel\Passport\TokenRepository;
910

11+
/**
12+
* @deprecated Will be removed in a future Laravel version.
13+
*/
1014
class AuthorizedAccessTokenController
1115
{
12-
/**
13-
* The token repository implementation.
14-
*
15-
* @var \Laravel\Passport\TokenRepository
16-
*/
17-
protected $tokenRepository;
18-
19-
/**
20-
* The refresh token repository implementation.
21-
*
22-
* @var \Laravel\Passport\RefreshTokenRepository
23-
*/
24-
protected $refreshTokenRepository;
25-
2616
/**
2717
* Create a new controller instance.
28-
*
29-
* @param \Laravel\Passport\TokenRepository $tokenRepository
30-
* @param \Laravel\Passport\RefreshTokenRepository $refreshTokenRepository
31-
* @return void
3218
*/
33-
public function __construct(TokenRepository $tokenRepository, RefreshTokenRepository $refreshTokenRepository)
34-
{
35-
$this->tokenRepository = $tokenRepository;
36-
$this->refreshTokenRepository = $refreshTokenRepository;
19+
public function __construct(
20+
protected TokenRepository $tokenRepository
21+
) {
3722
}
3823

3924
/**
4025
* Get all of the authorized tokens for the authenticated user.
4126
*
42-
* @param \Illuminate\Http\Request $request
43-
* @return \Illuminate\Database\Eloquent\Collection
27+
* @return \Illuminate\Database\Eloquent\Collection<int, \Laravel\Passport\Token>
4428
*/
45-
public function forUser(Request $request)
29+
public function forUser(Request $request): Collection
4630
{
47-
$tokens = $this->tokenRepository->forUser($request->user()->getAuthIdentifier());
48-
49-
return $tokens->load('client')->filter(function ($token) {
50-
return ! $token->client->firstParty() && ! $token->revoked;
51-
})->values();
31+
return $this->tokenRepository->forUser($request->user())
32+
->reject(fn (Token $token): bool => $token->client->revoked || $token->client->firstParty())
33+
->values();
5234
}
5335

5436
/**
5537
* Delete the given token.
56-
*
57-
* @param \Illuminate\Http\Request $request
58-
* @param string $tokenId
59-
* @return \Illuminate\Http\Response
6038
*/
61-
public function destroy(Request $request, $tokenId)
39+
public function destroy(Request $request, string $tokenId): Response
6240
{
6341
$token = $this->tokenRepository->findForUser(
64-
$tokenId, $request->user()->getAuthIdentifier()
42+
$tokenId, $request->user()
6543
);
6644

6745
if (is_null($token)) {
6846
return new Response('', 404);
6947
}
7048

7149
$token->revoke();
72-
73-
$this->refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
50+
$token->refreshToken?->revoke();
7451

7552
return new Response('', Response::HTTP_NO_CONTENT);
7653
}

0 commit comments

Comments
 (0)