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

时间:2017-09-08 06:56:21

标签: php laravel

当我使用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');

3 个答案:

答案 0 :(得分:13)

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

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

因此,即使您可能正在发送持有人令牌以使用特定用户,web后卫也不会知道任何相关信息,因为您没有用户通过{{1登录警卫,你得到一个web用户。

您有四种选择:

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

  2. 将您的默认警卫更改为api文件中的api。这可能不是你想要做的,特别是如果你有普通的网络用户。

  3. 告诉您希望config/auth.php后卫的用户请求。 api方法将后卫作为参数,因此如果您执行$request->user(),它将使用$request->user('api')后卫检索用户。

  4. 直接从api后卫获取用户:api

答案 1 :(得分:2)

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应该使用函数

答案 2 :(得分:0)

覆盖 createToken() 方法 app\Models\User.php,如下所示。

foreach ( $xml->business as $business ) {
   if($business->country == 'UK') {
      //Import the business
   }
}

并在您想要的任何地方创建如下所示的令牌并明确传递 $user_id。

public function createToken($user_id,$name, array $scopes = [])
{
    return Container::getInstance()->make(PersonalAccessTokenFactory::class)
    ->make(
        $user_id, $name, $scopes
    );
}

现在你会得到 $request->user()