代码之家  ›  专栏  ›  技术社区  ›  Wonka

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

  •  2
  • Wonka  · 技术社区  · 8 年前

    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 正确返回身份验证用户。

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

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

    2 回复  |  直到 8 年前
        1
  •  16
  •   Aken Roberts    8 年前

    通过 api Guard作为一个参数,在没有保护请求的中间件的情况下获取授权用户。

    $request->user('api');
    
    // Or
    
    auth('api')->user();
    
        2
  •  3
  •   Mark Walet    7 年前

    你在引用 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 门面是全球性的。它不取决于您试图访问的请求。同样的道理也适用于 request() Request:: 我相信是帮手。在您给出的情况下,您引用了一个错误的请求实例,因此给出了一个意外的结果。