如何检索 Laravel Passport 访问令牌过期时间或日期时间?
How to retrieve Laravel Passport access token expiration duration or datetime?
我正在使用 Laravel 5.4 和 Passport 4。我只想使用 First-Party-App
。因此,正如 所建议的那样,我想远离将 ClientID 和 ClientSecret 放在应用程序中。我已经输入了 AuthServiceProvider
的 boot()
方法:
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addDays(30));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));
我在 api.php
中添加了自己的路由以接受来自 App 的登录:
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 秒)或日期时间以便我可以自动进行计算?
以下是我设法从对象中获取它的方法:
正如 Tim Lewis 在评论中指出的那样,有一个 $token 属性,$user->createToken('API Access')
是一个包含 2 public 属性的 Laravel\Passport\PersonalAccessTokenResult
对象:$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 Passport Issue.
,它不会用 Laravel 5.4 密码授予类型中的个人访问令牌替换过期
<?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
);
}
//...
}
//...
我正在使用 Laravel 5.4 和 Passport 4。我只想使用 First-Party-App
。因此,正如 AuthServiceProvider
的 boot()
方法:
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addDays(30));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(60));
我在 api.php
中添加了自己的路由以接受来自 App 的登录:
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 秒)或日期时间以便我可以自动进行计算?
以下是我设法从对象中获取它的方法:
正如 Tim Lewis 在评论中指出的那样,有一个 $token 属性,$user->createToken('API Access')
是一个包含 2 public 属性的 Laravel\Passport\PersonalAccessTokenResult
对象:$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 Passport Issue.
,它不会用 Laravel 5.4 密码授予类型中的个人访问令牌替换过期<?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
);
}
//...
}
//...