如何结合使用Passport身份验证和常规laravel身份验证?
我希望用户登录到Web中间件和api中间件的页面。登录路由在api中间件中。目前,我已经设置了Passport身份验证,它适用于所有api中间件路由。如何使用户也登录Web中间件?
编辑#1
我在做什么:
登录代码
$http = new \GuzzleHttp\Client();
try {
$response = $http->post(config('services.passport.login_endpoint'), [
'form_params' => [
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $args['email'],
'password' => $args['password']
]
]);
$user = User::where('email', $args['email'])->first();
Auth::guard('web')->login($user);
return [
"token" => $response->getBody()->getContents(),
"user" => $user
];
} // ...
某些Web中间件路由中的某处
return auth()->check() ? "logged in" : "not logged in";
返回“未登录”
答案 0 :(得分:1)
实际上,我的处境与您一样。我已经搜索了很多。由于我的项目性质,我一直需要Web身份验证,但除此之外,与Web开发世界相比,我还开始开发具有api后端的项目。
我有点懒,所以我通常使用Laravel Passport,并且无需总是开箱即用,它可以完成这项工作,因此,我认为如果您只想要访问令牌的功能以实现api安全,请进行用户登录身份验证在网络端,只需使用api.php文件中的auth:api中间件对api端点进行身份验证即可。
我知道这不是最佳实践,但是由于听起来您不是在开发纯的Laravel SPA,所以您可以按照Vue供电的Laravel Multipage应用程序进行操作。
但是,相信我最好的方法是不同时使用Web身份验证或api身份验证,然后如上述答案所述,您将同时进行两个身份验证,听起来不行。
最后,当您想在刀片模板上获得经过身份验证的用户时,将使用
auth()->user()
但是另一方面,您应该使用api控制器
auth('api')->user()
使用起来很不错,但是很危险。
答案 1 :(得分:0)
如果需要将现有用户实例登录到应用程序中,则可以使用该用户实例调用login方法。
Auth::login($user);
您还可以使用guard()方法:
Auth::guard('web')->login($user);
有关更多信息,请参见此处的文档:https://laravel.com/docs/5.8/authentication#authenticating-users
答案 2 :(得分:0)
在理想情况下,您不应该这样做,因为护照身份验证用于与API通信的单独应用程序,而laravel预发货身份验证用于MVC,因此它们是独立的用户会话。
但是假设您知道自己在做什么,请通过API在用户登录时调用Auth::login($user);
,或者在用户通过Web中间件auth登录时生成护照令牌,以先发生的登录为准...
记住Auth::login($user);
创建一个用户会话并设置cookie来引用该会话...因此,您自己创建了一个新问题,即注销时,有两个地方可以从...注销(从技术上来说,是用户)已登录两次,带有护照令牌和指向他的会话的cookie ...