在下面的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()
但我们似乎无法使用该方法中提供的令牌访问用户。
知道如何在所有公共路线方法中访问有效令牌用户吗?
答案 0 :(得分:12)
将api
后卫作为参数传递,以便在没有中间件保护请求的情况下获取授权用户。
$request->user('api');
// Or
auth('api')->user();
答案 1 :(得分:2)
您正在从根命名空间引用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实例,从而产生意外结果。