我正在使用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
}
答案 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()
或请求对象。