20

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

<?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时间?

4

9 回答 9

32

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

个人访问令牌:

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

于 2019-01-15T09:34:34.910 回答
17

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

laravel/护照 >= 7.0.4

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

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

laravel/护照 < 7.0.4

如果你还没有使用passport 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数据库中的字段不会做任何事情。真正的到期日期存储在令牌本身内。此外,尝试修改expJWT 令牌内的声明将不起作用,因为令牌已签名并且对其进行任何修改都会使其无效。因此,您现有的所有令牌都将具有其原始到期时间,并且无法更改。如果需要,您将需要重新生成新令牌。

于 2019-06-21T00:05:21.610 回答
10

Passport 文档似乎回答了这个问题

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

在调用boot方法中AuthServiceProviderPassport::tokenExpiresIn()

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

    Passport::routes();

    Passport::tokensExpireIn(now()->addDays(15));

    Passport::refreshTokensExpireIn(now()->addDays(30));
}
于 2018-07-28T20:44:40.900 回答
0

啊,发现个人令牌总是长期存在的,并且无法配置:(

于 2017-03-05T14:26:52.423 回答
0

请参阅实现,以及如何将 PassportServiceProvider 替换为您的。它适用于 Laravel 5.5

于 2019-02-17T09:06:11.327 回答
0

我能够通过在我的项目中创建一个 PassportServiceProvider 来延长个人访问令牌的生命周期,该 PassportServiceProvider 从 laravel-passport 包中扩展了 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 配置文件中的提供程序以使用我项目中的提供程序。

于 2020-02-14T22:38:11.343 回答
-1

你可以这样做:

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

$token->save();
于 2017-05-17T15:42:45.027 回答
-1

文件: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);
}
于 2019-07-23T14:40:23.777 回答
-4

是的,我只是浪费了一天在 VERSION = '5.8' 中找到这个问题。

现在,也许我们需要修改 your-project/vendor/laravel/passport/src/Passport.php。

改变这个 -----> new DateInterval('P1Y') 。它是 php 函数,表示一个日期间隔。

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

护照中的三种令牌

1.tokensExpireIn 在 303 行。

  1. 个人AccessTokensExpireIn 在341 行。

  2. refreshTokensExpireIn 在 322 行。

于 2019-09-05T12:25:01.477 回答