Laravel 身份验证中间件“auth:api”

Posted

技术标签:

【中文标题】Laravel 身份验证中间件“auth:api”【英文标题】:Laravel Auth Middleware "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。

【问题讨论】:

【参考方案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 组合在同一个中间件中,用于您在其下定义的所有路由。

【讨论】:

以上是关于Laravel 身份验证中间件“auth:api”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.6 上的 Ajax 身份验证重定向

由用户会话验证的Laravel API路由

获取经过身份验证的用户 Laravel/Lumen Passport

Laravel 5.3 + Passport:总是未经身份验证的错误

使用 Laravel 和 Passport 在身份验证失败时响应状态码 401?

有没有办法在 laravel 的不同数据库中对用户进行身份验证?