web-dev-qa-db-fra.com

Comment récupérer Laravel Durée d'expiration du jeton d'accès Passport ou date/heure?

J'utilise Laravel 5.4 et Passport 4. Je souhaite utiliser uniquement First-Party-App uniquement. Donc, comme suggéré dans cette réponse , je veux éviter de mettre le ClientID et le ClientSecret dans l’application. J'ai mis en boot() la méthode de AuthServiceProvider:

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

J'ai ajouté mon propre itinéraire dans api.php pour accepter la connexion depuis l'application:

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

Ceci est mon action:

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

Existe-t-il une méthode permettant de récupérer le nombre de secondes pour expires_in (30 jours => 2592000s) ou la date/heure afin que je puisse effectuer le calcul automatiquement?

2
KeitelDOG

Voici comment j'ai réussi à l'obtenir de l'objet:

Comme Tim Lewis m'a indiqué dans les commentaires, il existe une propriété $ token, $user->createToken('API Access') est un objet Laravel\Passport\PersonalAccessTokenResult qui contient 2 propriétés publiques: $accessToken (String) et $token (Laravel\Passport\Token). Je reçois donc le jeton avec $objToken = $user->createToken('API Access'); et calcule le délai d'expiration en secondes avec $expiration = $objToken->token->expires_at->diffInSeconds(Carbon::now());. Voici le code final:

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

Mais soyez prudent si vous utilisez ces 2 lignes dans AuthServiceProvider boot ():

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

comme il ne remplacera pas l'expiration par un jeton d'accès personnel dans le type d'octroi de mot de passe de Laravel 5.4 conformément à ceci Laravel Issue de passeport .

2
KeitelDOG
<?php
//...
use Laravel\Passport\Bridge\PersonalAccessGrant;
use League\OAuth2\Server\AuthorizationServer;
//...

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot()
    {
        // http://php.net/manual/zh/dateinterval.construct.php
        $lifetime = new \DateInterval('P1W');

        $this->app->get(AuthorizationServer::class)
              ->enableGrantType(
                 new PersonalAccessGrant(), 
                 $lifetime
              );
    }

    //...
}
//...
0
overtrue