Как переопределить метод `issueToken` в Laravel/Passport

Я пытаюсь переопределить метод 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];
       }
     }
   }

Начиная с Laravel 8 это $request->getParsedBody()

KingLagalot 06.12.2020 21:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
3 301
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Маршрут жестко запрограммирован в коде поставщика.

Я предлагаю вам повторно объявить маршрут в вашем приложении, изменить этот код на промежуточное программное обеспечение, а затем обернуть маршрут вокруг него.

как бы я изменил свой код на промежуточное программное обеспечение? извините, я новичок в PHP и laravel по этому вопросу? маршрут, который я предполагаю, я бы повторно объявил в каталоге маршрутов в web.php или api.php @meda

juan_code18 08.03.2019 00:42
Ответ принят как подходящий

Достаточно просто переопределить маршрут в 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

juan_code18 08.03.2019 16:10

Это странно. Я проверил код перед ответом, и он работает для меня. Может быть, ваши маршруты кэшируются? php artisan route:clear @juan_code18

keyboardSmasher 08.03.2019 16:55

Кроме того, я отредактировал ответ, чтобы отметить, что вам нужно use Illuminate\Support\Facades\Route; в app/Providers/AuthServiceProvider.php @juan_code18

keyboardSmasher 08.03.2019 17:10

в вашем примере, когда вы объявляете Route::post, у вас есть oath/token вместо oauth/token, поэтому это может работать, потому что это работает для меня. если я исправляю написание, то метод не переопределяется. Спасибо за помощь. возможно, мне придется подумать об использовании другого маршрута @keyboardSmasher

juan_code18 08.03.2019 17:18

Справедливо. Я отредактировал опечатку и запустил код на своем сервере. Вы можете видеть, что вывод php artisan route:listoauth/token переопределен в моей установке. В любом случае, удачи. :) @juan_code18

keyboardSmasher 08.03.2019 17:36

Другие вопросы по теме