首页 > 解决方案 > 如何在 Laravel/Passport 中覆盖 `issueToken` 方法

问题描述

我正在尝试覆盖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];
       }
     }
   }

标签: phplaravellaravel-passport

解决方案


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

+--------+----------+-------------+--- ----------------------+---------------------------- ------------------------------------------------+- ------------+
| 域名 | 方法 | 网址 | 姓名 | 行动 | 中间件 |
+--------+----------+-------------+--- ----------------------+---------------------------- ------------------------------------------------+- ------------+
| | 发布 | oauth/令牌 | 护照.token | App\Http\Controllers\AccessTokenController@issueToken | 油门 |
| | 发布 | oauth/令牌/刷新 | 护照.token.refresh | Laravel\Passport\Http\Controllers\TransientTokenController@refresh | 网络,认证 |
| | 得到|头| oauth/令牌 | 护照.tokens.index | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | 网络,认证 |
| | 删除 | oauth/令牌/{token_id} | 护照.tokens.destroy | Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | 网络,认证 |
+--------+----------+-------------+--- ----------------------+---------------------------- ------------------------------------------------+- ------------+


推荐阅读