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/Lumen Passport
Laravel 5.3 + Passport:总是未经身份验证的错误