【问题标题】:Laravel 5.6 - How to get auth()->user() or $response->user() in api controller?Laravel 5.6 - 如何在 api 控制器中获取 auth()->user() 或 $response->user()?
【发布时间】:2018-11-15 12:07:49
【问题描述】:

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 中,这些是上面调用的 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
    }

}

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

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

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

【问题讨论】:

    标签: laravel laravel-5 laravel-5.5 laravel-5.6 laravel-passport


    【解决方案1】:

    api 守卫作为参数传递,以在没有保护请求的中间件的情况下获取授权用户。

    $request->user('api');
    
    // Or
    
    auth('api')->user();
    

    【讨论】:

    • 工作正常,因为 $request 必须实现 Mark Walet 建议的路径,两者都工作得很好。谢谢!
    【解决方案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 实例,因此给出了意外的结果。

    【讨论】:

    • 您建议的路径非常有效,唯一的问题是它仍然没有返回身份验证用户。解决方案是在使用 request 或替代 auth('api')->user(); 时执行 $request->user('api'); 而没有像 Aken Roberts 回答中的请求。非常感谢您的回答,点赞:)
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2019-11-07
    • 2017-03-29
    相关资源
    最近更新 更多