Php laravel passport:Request user()在auth:api中间件外部和返回的用户对象内部返回null

Php laravel passport:Request user()在auth:api中间件外部和返回的用户对象内部返回null,php,laravel,Php,Laravel,当我尝试使用auth:api中间件获取loggedin用户详细信息时,它会在我的控制器函数中返回包含详细信息的用户对象 api.php (with auth:api middleware returns User object) Route::group(['middleware' => 'auth:api'], function() { Route::get('users/mentor_details/{uuid}','UserController@getMentorProfi

当我尝试使用auth:api中间件获取loggedin用户详细信息时,它会在我的控制器函数中返回包含详细信息的用户对象

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中间件之外获取loggedin用户详细信息时,它返回null

api.php (without auth:api middleware return null)

Route::get('users/mentor_details/{uuid}','UserController@getMentorProfileDetails');

auth中间件是返回用户的中间件。auth:api只是指示使用api保护。在laravel的源代码中,文件
vendor/laravel/framework/src/light/Auth/Middleware/Authenticate.php
line62,函数shouldUse是设置Auth::user()对象的函数。还可以查看
vendor/laravel/framework/src/illumb/Auth/AuthManager.php
shouldUse函数

如果未提供Auth中间件,或者未指定保护,则使用默认保护来确定用户。除非您在
config/auth.php
文件中对此进行了更改,否则默认的保护是
web
保护

因此,当您转到不受特定身份验证中间件保护的路由时,加载的用户就是
web
guard提供的用户

因此,即使您可能正在发送承载令牌以使用特定用户,
web
guard对此一无所知,并且由于您没有用户通过
web
guard登录,因此您将获得一个
null
用户

您有四种选择:

  • 确保路由受
    auth:api
    中间件保护,该中间件指定
    api
    保护。但是,这将不允许来宾访问url

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

  • api
    guard告诉用户您想要的请求。
    $request->user()

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

  • 重写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\u id

    $user= new user();
    $accessToken = $user->createToken($user_id,'authToken')->accessToken;
    

    现在您将获得$request->user()

    $request->user('api');好多了,因为我的函数中已经有$request对象了。@patricus:很好的解释,伙计!我终于明白了我丢失的一小片拉威尔护照。非常感谢你!我是否必须在标题中使用某些内容??您还可以使用
    auth
    helper函数传递中间件名称<代码>身份验证('api')->用户()