Won*_*nka 4 laravel laravel-5 laravel-passport laravel-5.5 laravel-5.6
在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...
});
});
Run Code Online (Sandbox Code Playgroud)
在TestContoller这些是上面提到的2种方法:
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
}
}
Run Code Online (Sandbox Code Playgroud)
由于专用路由组具有auth:api中间件,因此我们将通过检查Authorization Bearer标头中提供的令牌来确保用户通过身份验证.仅当存在有效令牌时,才会将私有路由呈现给经过身份验证的用户.这就是为什么TestController@testauth2正确返回auth用户的原因.
现在,任何人都可以访问公共路线,有或没有令牌.如果Authorization Bearer标题中没有提供令牌,那么我们将没有经过身份验证的用户,这是有道理的.这就是为什么TestController@testauth1不返回auth用户.但是,当登录用户访问/testauth1公共路由时,他们在Authorization Bearer标头中提供其令牌,因此TestController@testauth1如果不是auth()->user()至少使用,则应该返回,$request->user()但我们似乎无法使用其提供的令牌访问该用户.
知道如何在所有公共路线方法中访问有效令牌用户吗?
Ake*_*rts 24
将api保护作为参数传递以获取授权用户,而不需要中间件保护请求.
$request->user('api');
// Or
auth('api')->user();
Run Code Online (Sandbox Code Playgroud)
您正在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
}
}
Run Code Online (Sandbox Code Playgroud)
该auth()辅助方法或Auth门面是全球可用。它不取决于您尝试访问的请求。我相信的帮助者request()和Request::帮助者也是如此。在你给出的情况下,你引用了一个错误的 Request 实例,因此给出了一个意想不到的结果。