Laravel结合了Passport身份验证和普通身份验证

时间:2019-03-11 21:20:27

标签: laravel laravel-passport

如何结合使用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";

返回“未登录”

3 个答案:

答案 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 ...