Laravel 5.6 - 如何在api控制器中获取auth() - > user()或$ response-> user()?

问题描述 投票:2回答:2

在下面的api.php路线文件中,有公共路线和私人路线:

Route::group(['namespace' => 'API'], function() {

     // Public routes (auth not required)
     Route::group([], function() {
         Route::get('/testauth1', 'TestController@testauth1');
         // more public routes...
     });

     // Private routes (auth required)
     Route::group(['middleware' => 'auth:api'], function() {
         Route::get('/testauth2', 'TestController@testauth2');
         // more private routes...
     });

});

TestContoller中,这些是上面提到的两种方法:

class TestController extends Controller {

    public function testauth1(\Request $request) {
      // return auth()->user(); // does not return user
      return $request->user(); // does not return user
    }

    public function testauth2() {
      return auth()->user(); // returns user
    }

}

由于私有路由组具有auth:api中间件,我们将通过检查Authorization Bearer头中提供的令牌来确保用户通过身份验证。仅当存在有效令牌时,才会将私有路由呈现给经过身份验证的用户。这就是TestController@testauth2正确返回auth用户的原因。

现在,任何人都可以访问公共路线,有或没有令牌。如果Authorization Bearer标头中没有提供令牌,那么我们将没有经过身份验证的用户,这是有道理的。这就是TestController@testauth1没有返回auth用户的原因。但是,当登录用户访问/testauth1公共路由时,他们在Authorization Bearer标头中提供他们的令牌,因此如果不是TestController@testauth1至少使用auth()->user(),则应该在$request->user()中返回但是我们似乎无法使用他们提供的令牌访问用户在那种方法中。

知道如何在所有公共路线方法中访问有效令牌用户吗?

laravel laravel-5 laravel-5.5 laravel-5.6 laravel-passport
2个回答
14
投票

api guard作为参数传递给获取授权的用户,而不需要中间件保护请求。

$request->user('api');

// Or

auth('api')->user();

3
投票

您正在从根命名空间引用Request\Request。相反,你应该参考Illuminate\Http\Request类。

您应该从参数中删除\并将以下行添加到导入中。

use Illuminate\Http\Request;

或者,您也可以直接在方法中引用请求类:

class TestController extends Controller {

    public function testauth1(Illuminate\Http\Request $request) {
        return $request->user();
    }

    public function testauth2() {
        return auth()->user(); // returns user
    }

}

auth()辅助方法或Auth Facade是全球可用的。它不依赖于您尝试访问的请求。我相信request()Request::助手也是如此。在您提供的情况下,您正在引用错误的Request实例,从而产生意外结果。

© www.soinside.com 2019 - 2024. All rights reserved.