如何检查用户是否通过护照认证(使用laravel-passport从令牌中获取用户)

时间:2019-08-16 18:35:40

标签: laravel laravel-passport laravel-socialite

我正在使用Passport将用户登录到Laravel API端点,使用laravel-socialite软件包使用其社交帐户(谷歌,facebook)对用户进行身份验证。

用于登录和注销用户的工作流程可以完美工作(生成令牌...等等)。问题是我有一个控制器,该控制器应根据是否有用户登录返回数据。

我确实从HTTP请求中拦截了Bearer令牌,但是我无法让用户使用该令牌(我将使用DB Facade基于令牌选择用户,但实际上我正在寻找是否有更干净的方法已在Passport中实施)

我也不想使用auth:api中间件,因为即使没有用户登录,控制器也可以正常工作并返回数据。

这是api路由:

Route::get("/articles/{tag?}", "ArticleController@get_tagged");

这是我希望控制器具有的逻辑

public function get_tagged($tag = "", Request $request)
{
    if ($request->header("Authorization"))
        // return data related to the user
    else
        // return general data
}

2 个答案:

答案 0 :(得分:2)

感谢@mdexp答案

就我而言,我可以使用解决我的问题

if (Auth::guard('api')->check()) {
    $user = Auth::guard('api')->user();
}

在我的控制器中。

答案 1 :(得分:0)

假设您将api防护设置为护照,则只需调用if (Auth::guard('api')->check())来检查经过身份验证的用户:

public function get_tagged($tag = "", Request $request)
{
    if (Auth::guard('api')->check()) {
        // Here you have access to $request->user() method that
        // contains the model of the currently authenticated user.
        //
        // Note that this method should only work if you call it
        // after an Auth::check(), because the user is set in the
        // request object by the auth component after a successful
        // authentication check/retrival
        return response()->json($request->user());
    }

    // alternative method
    if (($user = Auth::user()) !== null) {
        // Here you have your authenticated user model
        return response()->json($user);
    }

    // return general data
    return response('Unauthenticated user');
}

这将以与auth:api Guard相同的方式触发Laravel身份验证检查,但不会重定向用户。实际上,在身份验证检查失败后,重定向由Authenticate中间件(存储在vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php中)完成。

请注意,如果您未指定要使用的防护,Laravel将使用config/auth.php文件中的默认防护设置(通常在全新的Laravel安装中设置为Web)。

如果您希望坚持使用Auth门面/类,也可以改用Auth::guard('api')->user()或请求对象。