Как получить срок действия токена доступа Laravel Passport или дату и время?

Я использую Laravel 5.4 и Passport 4. Я хочу использовать только First-Party-App. Итак, как было предложено в этом ответе, я не хочу помещать ClientID и ClientSecret в приложение. Я вставил boot() метод AuthServiceProvider :

Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addDays(30));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));

Я добавил свой собственный маршрут в api.php для входа в систему из приложения:

Route::post('login', 'Auth\LoginController@apiLogin');

Это мое действие:

public function apiLogin(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...
        $user = Auth::user();
        $token = $user->createToken('API Access')->accessToken;

        return response()->json(["token_type" =>"Bearer","expires_in" => 2592000,"access_token" => $token]);
    }

    return response()->json(["error" => "invalid_credentials", "message" => "The user credentials were incorrect."], 401);
}

Есть ли способ получить количество секунд для expires_in (30 дней => 2592000 с) или дату и время, чтобы я мог сделать расчет автоматически?


person KeitelDOG    schedule 02.08.2018    source источник
comment
Вы должны иметь доступ к свойству expiry на $token. Как выглядит ваш ответ JSON для access_token? Кроме того, если вы не можете получить к нему доступ, вы всегда можете сделать $expire = Carbon::now()->diffInSeconds(Carbon::now()->addDays({days})); и вернуть его вместо 2592000, но это кажется долгим путем, чтобы получить {days} * 86400   -  person Tim Lewis    schedule 02.08.2018
comment
Большое спасибо Тиму Льюису! Я мог получить к нему доступ с помощью $token, который представляет собой модель Eloquent, содержащую токены: $objToken = $user->createToken('API Access');, и я сделал $expire = $objToken->token->expires_at->diffInSeconds(Carbon::now());. Однако Passport::tokensExpireIn((new DateTime())->add(new DateInterval('P30D'))); не работает, похоже на ошибку в Laravel 5.4 из-за того, что многие обсуждения игнорируют ее. Шанс, что я хотел это от самого имущества... Но это уже другая проблема. В любом случае, я опубликую это как ответ, тогда я выберу его как ответ.   -  person KeitelDOG    schedule 03.08.2018
comment
Ницца; рад, что у тебя все заработало. Что касается второй проблемы, при работе с Laravel у вас есть доступ к Carbon, поэтому вам не нужно использовать классы DateTime и DateInterval; по какой причине вы пытаетесь использовать этот конкретный код вместо Carbon::now()->addDays(30)? Кроме того, продолжайте и опубликуйте самостоятельный ответ; Я просто указал вам правильное направление :)   -  person Tim Lewis    schedule 03.08.2018
comment
Спасибо за предложение Карбона. Когда я использовал Laravel 4, я мало что знал об углероде. Теперь, когда я больше увлекаюсь Laravel 5+, я меняю некоторые привычки.   -  person KeitelDOG    schedule 03.08.2018


Ответы (2)


Вот как мне удалось получить его от объекта:

Как Тим Льюис указал мне в комментариях, есть свойство $token, $user->createToken('API Access') — это объект Laravel\Passport\PersonalAccessTokenResult, который содержит 2 общедоступных свойства: $accessToken (String) и $token (Laravel\Passport\Token). Итак, я получаю токен с помощью $objToken = $user->createToken('API Access'); и вычисляю время истечения срока действия в секундах с помощью $expiration = $objToken->token->expires_at->diffInSeconds(Carbon::now());. Вот окончательный код:

public function apiLogin(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...

        Passport::tokensExpireIn(Carbon::now()->addDays(30));
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));

        $user = Auth::user();
        $objToken = $user->createToken('API Access');
        $strToken = $objToken->accessToken;

        $expiration = $objToken->token->expires_at->diffInSeconds(Carbon::now());

        return response()->json(["token_type" => "Bearer", "expires_in" => $expiration, "access_token" => $strToken]);
    }

    return response()->json(["error" => "invalid_credentials", "message" => "The user credentials were incorrect."], 401);
}

Но будьте осторожны при использовании этих двух строк в AuthServiceProvider boot() :

Passport::tokensExpireIn(Carbon::now()->addDays(30));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));

поскольку он не заменит истечение срока действия токеном личного доступа в типе предоставления пароля Laravel 5.4 в соответствии с этим Laravel Выдача паспорта.

person KeitelDOG    schedule 03.08.2018

person    schedule
comment
Код всегда хорош, но он также помогает добавить некоторые комментарии/контекст о том, как это решает исходный вопрос. - person craigcaulfield; 01.11.2018