Срок годности маркера 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 строке.
personalAccessTokensExpireIn в 341 строке.
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);
}