Время жизни токена 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 день. Почему? Как изменить время опыта?


person Terion    schedule 05.03.2017    source источник


Ответы (10)


Вот методы, используемые для обновления срока действия для всех типов грантов:

Токен личного доступа:

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.

person vivek takrani    schedule 15.01.2019

Метод 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

Если вы еще не используете версию паспорта 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 в базе данных ничего не даст. Реальная дата истечения хранится внутри самого токена. Кроме того, попытка изменить утверждение exp внутри токена JWT не сработает, поскольку токен подписан, и любое его изменение сделает его недействительным. Таким образом, все ваши существующие токены будут иметь исходное время истечения срока действия, и изменить это невозможно. При необходимости вам потребуется повторно сгенерировать новые токены.

person patricus    schedule 21.06.2019

Паспортные документы, кажется, отвечают на этот вопрос

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

В методе boot вызова AuthServiceProvider Passport::tokenExpiresIn()

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

    Passport::routes();

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

    Passport::refreshTokensExpireIn(now()->addDays(30));
}
person anemo    schedule 28.07.2018

А, понял, личные токены всегда долгоживущие и это нельзя настроить :(

person Terion    schedule 05.03.2017

если ты сделаешь

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

то срок действия не проверяется ни при каком запросе, поэтому я думаю, что это недопустимый вариант для личных токенов.

person Carlos Rodríguez    schedule 28.09.2017

См. эту реализацию и здесь как заменить PassportServiceProvider вашим. У меня сработало с Laravel 5.5

person vitsen    schedule 17.02.2019

Я смог продлить время жизни токена личного доступа, создав в своем проекте PassportServiceProvider, который расширяет PassportServiceProvider из пакета laravel-passport. Затем я просто добавил этот метод, чтобы переопределить метод из 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, чтобы использовать его из моего проекта.

person Andrew Servi    schedule 14.02.2020

ты можешь сделать это:

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

$token->save();
person maturecheese    schedule 17.05.2017
comment
Значение expires_at в таблице БД предназначено только для справки. Отметка времени истечения срока действия закодирована в токен JWT. Это не сработает. - person Tihomir Mihaylov; 01.02.2018
comment
Я думаю, что ответ основан на сообщении https://medium.com/modulr/create-api-authentication-with-passport-of-laravel-5-6-1dc2d400a7f Но это не работает - person Manojkiran.A; 03.02.2019

Файл: 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);
}
person GuruAmmu    schedule 23.07.2019
comment
Объясните, почему это решит проблему, а также где пользователь ошибается. - person Coder; 23.07.2019
comment
Или как он добавляет больше информации, чем существующие ответы на вопрос. К вашему сведению, мой ответ, более чем за месяц до этого, уже касался этого. - person patricus; 26.09.2019

Да, я только что потратил один день, чтобы найти эту проблему в VERSION = '5.8'.

На данный момент, возможно, нам нужно изменить your-project/vendor/laravel/passport/src/Passport.php.

Измените этот -----> новый DateInterval('P1Y') . это функция php Представляет интервал дат.

D---> означает день Y---> означает год M---> означает месяц

три вида жетонов в паспорте

1.tokensExpireIn в строке 303.

  1. personalAccessTokensExpireIn в строке 341.

  2. refreshTokensExpireIn в строке 322.

person Kapil Pal    schedule 05.09.2019
comment
Не рекомендуется изменять код поставщика. Он будет перезаписан при следующем обновлении композитора, а изменения поставщика не записываются в репозиторий, поэтому их нельзя развернуть в новых средах. В моем ответе показано, как решить проблему с токенами личного доступа без изменения кода поставщика. - person patricus; 26.09.2019