Срок годности маркера Laravel

Я не понимаю, что я делаю неправильно. Я не могу установить время истечения токена.

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

Ответ 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

Документы Passport, похоже, отвечают на этот вопрос

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));
}

Ответ 3

Метод createToken() создает 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));

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

Ответ 4

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

Ответ 5

если вы это сделаете

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

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

Ответ 6

Пожалуйста, посмотрите эту реализацию, и здесь, как заменить PassportServiceProvider на ваш. Это сработало для меня с Laravel 5.5

Ответ 7

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

На данный момент, возможно, нам нужно изменить ваш-проект/продавец/Laravel/паспорт/SRC/Passport.php.

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

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

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

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

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

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

Ответ 8

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

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

$token->save();

Ответ 9

Файл: 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);
}