如何检查用户是否通过护照进行身份验证(使用 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();
}
在我的控制器中。
我正在使用 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();
}
在我的控制器中。