Я пытаюсь переопределить метод issueToken, расположенный в \Laravel\Passport\Http\Controllers\AccessTokenController, без добавления нового маршрута, то есть (api/oauth/token). Я создал свой собственный AccessTokenController, который выполняет нужные мне функции, но когда я вызываю oauth/token, выполняется родительский метод, а не моя реализация. Я что-то упускаю, чтобы завершить переопределение?
<?php
namespace App\Http\Controllers;
use phpseclib\Crypt\RSA;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Psr\Http\Message\ServerRequestInterface;
use \Laravel\Passport\Http\Controllers\AccessTokenController as ATC;
class AccessTokenController extends ATC {
public function issueToken(ServerRequestInterface $request){
try {
// Fetching username from request
$username = $request->getParseBody()['username'];
// Fetching the User
$user = User::where('email', '=', $username);
// Genereting token
$tokenResponse = parent::issueToken($request);
//convert response to json string
$content = $tokenResponse->getBody()->__toString();
$content['email'] = $user['emial'];
//convert json to array
$data = json_decode($content, true);
return $data;
} catch (OAuthServerException $e) {
return ['Message' => 'The suer credentials were incorrect!'];
}catch (\Exception $e) {
return ['Message' => 'Exception: '.$e];
}
}
}






Маршрут жестко запрограммирован в коде поставщика.
Я предлагаю вам повторно объявить маршрут в вашем приложении, изменить этот код на промежуточное программное обеспечение, а затем обернуть маршрут вокруг него.
как бы я изменил свой код на промежуточное программное обеспечение? извините, я новичок в PHP и laravel по этому вопросу? маршрут, который я предполагаю, я бы повторно объявил в каталоге маршрутов в web.php или api.php @meda
Достаточно просто переопределить маршрут в app/Providers/AuthServiceProvider.php.
Не забудьте добавить: use Illuminate\Support\Facades\Route; вверху файла!
public function boot()
{
$this->registerPolicies();
Passport::routes();
Route::post('/oauth/token', [
'uses' => '\App\Http\Controllers\AccessTokenController@issueToken',
'as' => 'passport.token',
'middleware' => 'throttle',
]);
}
Выход php artisan route:list --name=passport.token:
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
| | POST | oauth/token | passport.token | App\Http\Controllers\AccessTokenController@issueToken | throttle |
| | POST | oauth/token/refresh | passport.token.refresh | Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
| | GET|HEAD | oauth/tokens | passport.tokens.index | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth |
| | DELETE | oauth/tokens/{token_id} | passport.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth |
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
я внес предложенные вами изменения, но я все еще использую родительский метод, а не свою реализацию. на самом деле, если я укажу неправильный путь, т.е. ('uses' => '\App\Http\Controllers\NONE\AccessTokenController@issueToken',) к моему контроллеру, это не даст мне ошибку, поэтому я так не думаю даже смотрит туда. @keyboardSmasher
Это странно. Я проверил код перед ответом, и он работает для меня. Может быть, ваши маршруты кэшируются? php artisan route:clear @juan_code18
Кроме того, я отредактировал ответ, чтобы отметить, что вам нужно use Illuminate\Support\Facades\Route; в app/Providers/AuthServiceProvider.php @juan_code18
в вашем примере, когда вы объявляете Route::post, у вас есть oath/token вместо oauth/token, поэтому это может работать, потому что это работает для меня. если я исправляю написание, то метод не переопределяется. Спасибо за помощь. возможно, мне придется подумать об использовании другого маршрута @keyboardSmasher
Справедливо. Я отредактировал опечатку и запустил код на своем сервере. Вы можете видеть, что вывод php artisan route:listoauth/token переопределен в моей установке. В любом случае, удачи. :) @juan_code18
Начиная с Laravel 8 это
$request->getParsedBody()