[英]laravel passport: Request user() returning null outside auth:api middleware, and inside returning user object
当我试图使用 auth:api 中间件获取登录用户详细信息时,它会在我的控制器函数中返回包含详细信息的用户对象。
api.php (with auth:api middleware returns User object)
Route::group(['middleware' => 'auth:api'], function() {
Route::get('users/mentor_details/{uuid}','UserController@getMentorProfileDetails');
});
但是,当我尝试在此 auth:api 中间件之外获取登录用户详细信息时,它返回 null。
api.php (without auth:api middleware return null)
Route::get('users/mentor_details/{uuid}','UserController@getMentorProfileDetails');
当没有提供 auth 中间件,或者提供了没有指定守卫时,使用默认守卫来确定用户。 除非您在config/auth.php
文件中更改了此设置,否则默认防护是web
防护。
因此,当您转到不受特定身份验证中间件保护的路由时,加载的用户是web
警卫提供的用户。
因此,即使您可能正在发送不记名令牌以使用特定用户,但web
Guard 对此一无所知,并且由于您没有通过web
Guard 登录的用户,您将获得一个null
用户。
你有四个选择:
确保路由受到auth:api
中间件的保护,该中间件指定了api
保护。 但是,这将不允许客人访问该网址。
在config/auth.php
文件中将默认保护更改为api
。 这可能不是您想要做的,尤其是如果您确实有普通的网络用户。
从api
守卫告诉你想要用户的请求。 $request->user()
方法需要一个守卫作为参数,所以如果你执行$request->user('api')
,它将使用api
守卫检索用户。
直接从api
guard 获取用户: auth()->guard('api')->user()
。
auth 中间件是返回用户的中间件。 auth:api 只是表示使用 API 防护。 在 laravel 的源代码中,文件vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php
第62行,函数 shouldUse 是设置 Auth::user() 对象的函数。 还可以查看vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php
shouldUse 函数
覆盖 createToken() 方法 app\Models\User.php 如下所示。
public function createToken($user_id,$name, array $scopes = [])
{
return Container::getInstance()->make(PersonalAccessTokenFactory::class)
->make(
$user_id, $name, $scopes
);
}
并在您想要的任何地方创建如下所示的令牌并显式传递 $user_id。
$user= new user();
$accessToken = $user->createToken($user_id,'authToken')->accessToken;
现在你会得到 $request->user()
覆盖 register() 方法 app\Exceptions\Handler.php 如下 -
公共功能寄存器(){
$this->renderable(function (\Illuminate\Auth\AuthenticationException $e, $request) {
if ($request->is('api/*')) {
return response()->json([
'message' => 'Not authenticated'
], 401);
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.