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

how to check if user is authenticated with passport (get user from token using laravel-passport)

我正在使用 Passport 将用户登录到 Laravel API 端点,用户使用他们的社交帐户(google、facebook)使用 laravel-socialite 程序包进行身份验证.

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

我确实从 HTTP 请求中拦截了 Bearer 令牌,但我无法让用户使用该令牌(我会使用 DB facade select 基于令牌的用户,但我实际上正在寻找是否Passport 中已经实现了一种更简洁的方法)

我也不想使用 auth:api 中间件,因为即使没有用户登录,控制器也应该工作 return 数据。

这是 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
}

假设您将 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 守卫相同的方式触发 Laravel 身份验证检查,但不会将用户重定向。实际上,重定向是由 Authenticate 中间件(存储在 vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php 中)在身份验证检查失败时完成的。

请注意,如果您不指定要使用的守卫,Laravel 将使用 config/auth.php 文件中的默认守卫设置(通常设置为新 Laravel 上的网络安装)。

如果您更喜欢使用 Auth facade/class,您也可以使用 Auth::guard('api')->user() 或请求对象。

感谢@mdexp 的回答

就我而言,我可以使用

解决我的问题
if (Auth::guard('api')->check()) {
    $user = Auth::guard('api')->user();
}

在我的控制器中。