拉拉维尔护照令牌寿命

我不明白我做错了什么。我无法设置令牌过期时间。

<?php

namespace App\Providers;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        Passport::tokensExpireIn(Carbon::now()->addDays(1));
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
    }
}

但是当我调用时,例如:$user->createToken()

<?php
// as a demo
namespace App\Http\Middleware;

class ParseSpecialToken
{
    public function handle($request, Closure $next)
    {
        $user = User::find(1);
        $accessToken = $user->createToken('Some token')->accessToken;
        $request->headers->add(['Authorization' => 'Bearer '. $accessToken]);

        return $next($request);
    }
}

令牌到期仍为 1 年,而不是 1 天。为什么?如何更改到期时间?


答案 1

以下是用于更新所有授权类型的过期时间的方法:

个人访问令牌:

public function boot(){
        $this->registerPolicies();

        Passport::routes();
        Passport::personalAccessTokensExpireIn(Carbon::now()->addHours(24));
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}

休息所有

public function boot(){
        $this->registerPolicies();

        Passport::routes();
        Passport::tokensExpireIn(Carbon::now()->addHours(24));
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}

只需在AuthServiceProvider的引导方法中更新上述代码即可。


答案 2

该方法创建个人访问令牌。默认情况下,这些令牌在 1 年后过期(如果由 laravel/passport 创建,则为 100 年<= 1.0.11)。或 方法不会修改此类型令牌的过期时间。createToken()Passport::tokensExpireIn()Passport::refreshTokensExpireIn()

拉拉维尔/护照>= 7.0.4

Passport 版本 7.0.4 添加了一个新方法,可用于更新个人访问令牌的过期时间。如果您使用的是此版本或更高版本,则可以将此方法调用添加到您的方法中。Passport::personalAccessTokensExpireIn()AuthServiceProvider::boot()

Passport::personalAccessTokensExpireIn(Carbon::now()->addDays(1));

拉拉维尔/护照 < 7.0.4

如果尚未使用护照版本 7.0.4,仍可以修改个人访问令牌过期时间,但更手动。您需要启用具有所需过期时间的个人访问权限授予的新实例。这也可以在您的方法中完成。AuthServiceProvider::boot()

$server = $this->app->make(\League\OAuth2\Server\AuthorizationServer::class);
$server->enableGrantType(new \Laravel\Passport\Bridge\PersonalAccessGrant(), new \DateInterval('P100Y'));

注意

修改数据库中的字段不会执行任何操作。真正的到期日期存储在令牌本身内。此外,尝试修改 JWT 令牌内的声明将不起作用,因为令牌已签名,对它的任何修改都会使其无效。因此,所有现有令牌都将具有其原始到期时间,并且无法更改该时间。如果需要,您将需要重新生成新令牌。expires_atexp


推荐