【问题标题】:Laravel Auth Middleware "auth:api"Laravel 身份验证中间件“auth:api”
【发布时间】:2021-01-21 06:36:20
【问题描述】:

我有一条路线如下

Route::group(['middleware' => ['auth:api']], function(){
    
    Route::post('getList','SomeController@someAction')->name('logout'); 
});

当我在没有令牌的情况下调用它时,它会失败,这是预期的行为。

但是当我称它为具有以下代码库时

Route::group(['middleware' => ['auth','api']], function(){

    Route::post('getList','SomeController@someAction')->name('logout'); 
});

没有令牌,它不会失败并返回所需的数据。

['auth:api'] 和 ['auth','api'] 有什么区别?

P.S : 在这两种情况下,我都会发送 Session-Cookie。

【问题讨论】:

    标签: laravel api authentication token laravel-passport


    【解决方案1】:

    要回答您的上述问题,了解 laravel 的基本身份验证系统以及中间件的工作原理是非常重要的。

    简而言之,auth 是一个中间件,首先定义在 App\Http\Kernel 中,然后 api 是传递给中间件的守卫。 api配置可以在config/auth.php中找到

    api 是用于所有 api 路由的中间件,这意味着这些路由不能通过在 url bar 中使用来访问

    在你的情况下

    Route::group(['middleware' => ['auth:api']], function(){
    
           Route::post('getList','SomeController@someAction')->name('logout'); 
    });
    

    表示您正在为 API 加载身份验证。这意味着您将根据令牌而不是用户会话对用户进行身份验证。这样,您将无法使用浏览器上的链接 url 访问网站。因此,首先您定义了要使用身份验证“auth”,然后声明要在身份验证上使用 api 保护。 auth 的 API 保护在 config/auth.php 中定义

    接下来的事情

    Route::group(['middleware' => ['auth','api']], function(){
    
          Route::post('getList','SomeController@someAction')->name('logout'); 
    });
    

    在上述问题上,您根据您在 HTTP/Kernel.php 中提到的名称对中间件进行分组

    ['middleware' => ['auth','api']
    

    这意味着您的所有路由都通过名为 auth 和 api 的中间件。

    所以你的 HTTP/Kernal.php 中可能有这个

     protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    
        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
    
    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
    

    这意味着您将 auth 和 api 组合在同一个中间件中,用于您在其下定义的所有路由。

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 2017-02-26
      • 2019-06-12
      • 1970-01-01
      • 2021-02-03
      • 2021-08-02
      • 1970-01-01
      • 2018-07-25
      • 2015-08-02
      相关资源
      最近更新 更多