Laravel Passport令牌生命周期

时间:2017-03-05 14:16:20

标签: php laravel oauth-2.0 laravel-5.4 laravel-passport

我不知道自己做错了什么。 我无法设置令牌到期时间。

<?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天。为什么?如何更改exp时间?

10 个答案:

答案 0 :(得分:7)

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

个人访问令牌:

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的启动方法中更新以上代码即可。

答案 1 :(得分:1)

请参阅this implementationhere如何用您的替换PassportServiceProvider。它适用于Laravel 5.5

答案 2 :(得分:0)

啊,弄清楚个人代币总是很长寿,而且无法配置:(

答案 3 :(得分:0)

你可以这样做:

$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
$token->expires_at =
        Carbon::now()->addDays(env('PERSONAL_ACCESS_TOKEN_EXPIRY__DAYS'));

$token->save();

答案 4 :(得分:0)

如果你这样做

$token->expires_at =
        Carbon::now()->addDays(env('PERSONAL_ACCESS_TOKEN_EXPIRY__DAYS'));

然后在任何请求时都不会检查到期日期,所以我认为它不是个人令牌的有效选项。

答案 5 :(得分:0)

Passport文档似乎可以回答这个问题

https://laravel.com/docs/5.6/passport#token-lifetimes

boot的{​​{1}}方法中,调用AuthServiceProvider

Passport::tokenExpiresIn()

答案 6 :(得分:0)

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

laravel / passport> = 7.0.4

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

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

laravel / passport <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'));

注意

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

答案 7 :(得分:0)

文件: AuthServiceProvider.php

添加这些行

use Laravel\Passport\Bridge\PersonalAccessGrant;
use League\OAuth2\Server\AuthorizationServer;

在启动功能中添加以下代码

public function boot() {
     Passport::routes();
     $lifetime = new \DateInterval('PT24H'); // For 24hours

     $this->app->get(AuthorizationServer::class)->enableGrantType(new PersonalAccessGrant(), $lifetime);
}

答案 8 :(得分:0)

通过在我的项目中创建一个通过laravel-passport包扩展PassportServiceProvider的PassportServiceProvider,我能够延长个人访问令牌的寿命。然后,我刚刚添加了此方法以覆盖PassportServiceProvider中的方法。



    /**
     * Register the authorization server.
     *
     * @return void
     */
    protected function registerAuthorizationServer()
    {
        $this->app->singleton(AuthorizationServer::class, function () {
            return tap($this->makeAuthorizationServer(), function ($server) {
                $server->enableGrantType(
                    $this->makeAuthCodeGrant(), Passport::tokensExpireIn()
                );

                $server->enableGrantType(
                    $this->makeRefreshTokenGrant(), Passport::tokensExpireIn()
                );

                $server->enableGrantType(
                    $this->makePasswordGrant(), Passport::tokensExpireIn()
                );

                $server->enableGrantType(
                    new PersonalAccessGrant(), Passport::tokensExpireIn() // this is the line that was updated from the original method
                );

                $server->enableGrantType(
                    new ClientCredentialsGrant(), Passport::tokensExpireIn()
                );

                if (Passport::$implicitGrantEnabled) {
                    $server->enableGrantType(
                        $this->makeImplicitGrant(), Passport::tokensExpireIn()
                    );
                }
            });
        });
    }

然后我刚刚更新了app.php配置文件中的提供程序,以使用我项目中的提供程序。

答案 9 :(得分:-1)

是的,我只是浪费了一天在VERSION ='5.8'中发现了此问题。

目前,也许我们需要修改 您的项目/供应商/laravel/passport/src/Passport.php。

更改此----->新的DateInterval('P1Y')。它是php函数,代表日期间隔。

  

D --->表示日期   Y --->表示年份   M --->表示月份

护照中的三种令牌

1.tokensExpireIn位于303行。

  1. personalAccessTokensExpireIn在341行中。

  2. refreshTokensExpireIn 322行。