繁体   English   中英

laravel 护照:请求 user() 在 auth:api 中间件之外返回 null,在返回用户对象内部

[英]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用户。

你有四个选择:

  1. 确保路由受到auth:api中间件的保护,该中间件指定了api保护。 但是,这将不允许客人访问该网址。

  2. config/auth.php文件中将默认保护更改为api 这可能不是您想要做的,尤其是如果您确实有普通的网络用户。

  3. api守卫告诉你想要用户的请求。 $request->user()方法需要一个守卫作为参数,所以如果你执行$request->user('api') ,它将使用api守卫检索用户。

  4. 直接从api guard 获取用户: auth()->guard('api')->user()

auth 中间件是返回用户的中间件。 auth:api 只是表示使用 API 防护。 在 laravel 的源代码中,文件vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php62行,函数 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM