laravel - 在有限的生命周期内使用 Passport 发行访问令牌
问题描述
后端:Laravel api。 前端:角度。
在 Laravel 上设置 Passport 包后,我使用常规方式对用户进行身份验证,然后以这种方式发出令牌:
$newToken = $user->createToken('myapp')->accessToken;
这工作正常,但问题是令牌生命周期为 1 年,因为它考虑了个人访问令牌,并且如文档所述:
个人访问令牌总是长期存在的。使用 tokensExpireIn 或 refreshTokensExpireIn 方法时,它们的生命周期不会被修改。
我的问题是如何在生命周期有限的应用程序中为我的用户颁发令牌?
另一方面,暴露似乎很危险client_secred
,client_id
所以我不能oauth/token
从我的角度应用程序中调用
解决方案
我确定这不是最好的解决方案,但这就是我想出的,非常感谢八十五个答案:
首先在您的身份验证控制器中添加这个受保护的方法。
protected function oauthLogin(Request $request)
{
$client = DB::table('oauth_clients')
->where('password_client', true)
->first();
$request->request->add([
"grant_type" => "password",
"username" => $request->email,
"password" => $request->password,
"client_id" => $client->id,
"client_secret" => $client->secret,
]);
$tokenRequest = $request->create(
env('APP_URL') . '/oauth/token',
'post'
);
$instance = Route::dispatch($tokenRequest);
return json_decode($instance->getContent());
}
然后仅在验证用户身份后调用 login 方法中的方法:
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
try {
// verify the credentials and create a token for the user
if ($token = Auth::guard('web')->attempt($credentials)) {
$user = Auth::guard('web')->user();
$roles = $user->roles()->get()->pluck('name');
$accessToken = $this->oauthLogin($request)->access_token; // instead of $user->createToken('token')->accessToken,
return response()->json([
'token' => $accessToken,
'roles' => $roles,
'email' => $request->input('email')
]);
} else {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (Exception $e) {
// something went wrong
return response()->json(['error' => 'could_not_create_token'], 500);
}
}
这样,颁发的令牌仅限于您在AuthServiceProvider.php中设置的时间:
public function boot()
{
$this->registerPolicies();
//
Passport::routes();
Passport::tokensExpireIn(now()->addHour(1));
Passport::refreshTokensExpireIn(now()->addHour(1));
}
推荐阅读
- python - 合并列,如果值不同,则使用 pandas 获取任何非空值
- python - Seaborn Catplot Violin 以负整数绘制年龄分布
- firebase - 在 null 上调用了 getter 'document'。溪流
文件没有被退回 - android - 在颤动中如何设置等待未来的方法
- javascript - 将网站的特定 div 嵌入另一个网站?
- sql - 访问:“聚合”类型不是有效名称
- c - 在C中的循环中反转数组
- android - 我们可以在单个应用程序中使用 onCreateDialog 中的不同整数一起打印时间选择器和日期吗?
- java - 有没有办法避免在多个方法中重复创建对象而不在类级别创建对象
- amazon-elastic-beanstalk - 环境健康已从信息转变为降级。ELB 进程不健康