如何覆盖 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 |
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
我正在尝试覆盖 \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 | +--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+