我已将这两个事件监听器添加到我的EventServiceProvider
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
];
在我的AuthServiceProvider中,我有:
public function boot()
{
$this->registerPolicies();
Passport::routes();
passport::$revokeOtherTokens;
passport::$pruneRevokedTokens;
Passport::tokensExpireIn(Carbon::now()->addDays(1));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(2));
}
我希望护照撤销所有其他用户访问令牌,如果被撤销则修剪它们。但是没有任何事情发生,每当我从邮递员请求访问令牌时,我都会获得一个新的访问令牌,而数据库中有多个访问令牌。
答案 0 :(得分:16)
我解决了我的问题这样:
第1步 - 在EventServiceProvider
中应该更改创建的访问令牌的路径,并刷新创建的令牌:
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
];
Step2-生成这两个侦听器事件:
php artisan event:generate
第3步 - 修改AccessTokenCreated
& RefreshTokenCreated
事件处理方法:
RevokeOldTokens类:
namespace App\Listeners;
use Laravel\Passport\Events\AccessTokenCreated;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use DB;
class RevokeOldTokens
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param AccessTokenCreated $event
* @return void
*/
public function handle(AccessTokenCreated $event)
{
DB::table('oauth_access_tokens')
->where('id', '<>', $event->tokenId)
->where('user_id', $event->userId)
->where('client_id', $event->clientId)
->update(['revoked' => true]);
}
}
PruneOldTokens类:
namespace App\Listeners;
use Laravel\Passport\Events\RefreshTokenCreated;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use DB;
class PruneOldTokens
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param RefreshTokenCreated $event
* @return void
*/
public function handle(RefreshTokenCreated $event)
{
DB::table('oauth_refresh_tokens')
->where('id', '<>', $event->refreshTokenId)
->where('access_token_id', '<>', $event->accessTokenId)
->update(['revoked' => true]);
}
}
完成此步骤后,如果我向项目发送任何请求,它将检查令牌,如果有另一个令牌,它将撤消它并使其不受理解。
答案 1 :(得分:0)
可能是因为你错过了让护照可以找到的重要信息,
1-在config / app.php的providers数组中注册Passport服务提供程序 Laravel \护照\ PassportServiceProvider ::类,
1-您必须将Laravel \ Passport \ HasApiTokens特征添加到App \ User模型 在你的config / auth.php配置文件中,你应该将api认证保护的驱动程序选项设置为护照
检查一下 http://www.snippetcase.com/snippet/61/API+Authentication+(Passport)+Laravel+5.3