如何覆盖 Laravel/Passport 中的 `issueToken` 方法

How to override `issueToken` method in Laravel/Passport

我正在尝试覆盖 \Laravel\Passport\Http\Controllers\AccessTokenController 中的 issueToken 方法而不添加新路由,即(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];
       }
     }
   }

路由硬编码在供应商内部的代码中。

我建议您在您的应用中重新声明路由,将此代码更改为中间件,然后将路由包裹起来。

只需覆盖 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   |
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+