Php 如何覆盖Laravel/Passport中的'issueToken'方法
我试图覆盖Php 如何覆盖Laravel/Passport中的'issueToken'方法,php,laravel,laravel-passport,Php,Laravel,Laravel Passport,我试图覆盖\Laravel\Passport\Http\Controllers\AccessTokenController中的issueToken方法,而不添加新路由,即(api/oauth/token)。我已经构建了自己的AccessTokenController来执行我想要的功能,但是当我调用oauth/token时,正在执行父方法,而不是我的实现。。我是不是搞错了什么东西来完成超控 <?php namespace App\Http\Controllers; use ph
\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中覆盖路由就足够了
确保添加:使用照明\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路由的输出:列表--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 |
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
|域|方法| URI |名称|操作|中间件|
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
|| POST | oauth/token | passport.token | App\Http\Controllers\AccessTokenController@issueToken|节流阀|
|| 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|
||删除| oauth/tokens/{token_id}| passport.tokens.destroy | Laravel\passport\Http\Controllers\AuthorizedAccessTokenController@destroy| web、auth|
+--------+----------+-------------------------+-------------------------+---------------------------------------------------------------------------+------------+
如何将代码更改为中间件?对不起,我对PHP和laravel还不太熟悉?我假设我会在web.php
或api.php
@medai中的routes目录中重新声明路由,但我仍然使用父方法,而不是我的实现。事实上,如果我设置了错误的路径,即('uses'=>'\App\Http\Controllers\NONE\AccessTokenController@issueToken’,)对我的控制器来说,它没有给我一个错误,所以我认为它甚至没有在那里查看@真奇怪。我在回答之前测试了代码,它对我来说很有用。也许你的路线被缓存了php artisan route:clear
@juan_Code18另外,我编辑了答案以注意您需要use Illumb\Support\Facades\route在app/Providers/AuthServiceProvider.php
@juan_code18中,在您的示例中,当您声明Route::post
时,您拥有的是誓言/令牌
而不是oauth/token
,这就是为什么它可能有效,因为它对我有效。如果我更正了拼写,则不会覆盖该方法。谢谢你的帮助。我可能不得不考虑使用不同的路径@keyboardSmasherFair。我编辑了输入错误并在服务器上运行了代码。您可以看到php-artisan-route:list
oauth/token
的输出在我的安装中被覆盖。无论如何,祝你好运@juan_Code18从Laravel 8开始,它是$request->getParsedBody()