[PHP] 浅谈 Laravel Authentication 的 auth:api
auth:api 在 Laravel 的 Routing , Middleware , API Authentication 主题中都有出现。
一.
在 Routing 部分可以知道 auth:api 是中间件的名字,代表某个中间件实现,使用方式为 Route::middleware('auth:api')。
二.
在 Middleware 部分可以知道 auth:api 冒号后面的是 中间件参数,多个参数就用逗号分隔,也就是说 'api' 是 auth 中间件的参数。auth 中间件在 app/Http/Kernel.php 的路由中间件里定义:protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class ]。
Middleware 中间件都是在 handle 方法里对请求进行验证的,handle 前面两个参数是 $request, Closure $next。中间件参数在 handle 的默认参数后面,例如 user:creater,editer 就表示 user 中间件的 handle 方法的第三个参数值是 creater, 第四个参数值是 editer。
对于 Auth 中间件来说,参数值 api 表示所使用的 guard 是 api,我们可以看其所继承的父类实现:
// Illuminate\Auth\Middleware\Authenticate->handle() public function handle($request, Closure $next, ...$guards) { $this->authenticate($request, $guards); return $next($request); }
里面的验证所使用的就是下面要讲的 Auth 功能类(AuthManager)。当验证不通过,会抛出 AuthenticationException。
默认的 app/Http/Middleware/Authenticate 包含一个 redirectTo 方法,当我们构建 api 应用时,验证未通过并不需要重定向。
那么可以注释掉 redirectTo,然后在 handler.php 中处理 AuthenticationException。
三.
在 API Authentication 部分,config/auth.php 配置有多个 guards,分别有自己的 driver 和 providers。
另外 Auth Facade (AuthManager) 提供了 Auth::guard() 方法用于决定 Auth 所使用的 guard。
Auth(Facade)提供了统一的方法来处理用户认证检测、驱动的扩展,通过更改配置而不是代码来使用不同的驱动。
Auth 内置了两种驱动的实现,AuthManager->createSessionDriver($name, $config), AuthManager->createTokenDriver($name, $config)。
如果你想更进一步了解 API Authentication 的运行过程,建议阅读一下 createTokenDriver() 内部实例化的 TokenGuard 类。
TokenGuard 会顺序检测 "query request"、"input request"、"header 键为 Authentication 值为 bearer xxx",从中获取 token 值;接着根据配置中的 provider 的值创建 provider 具体实例来验证 token。
有关 auth:api 与 Auth 的意义大致如此。
相关:[PHP] 浅谈 Laravel Authentication 的 guards 与 providers
相关:[PHP] 浅谈 Laravel auth:api 不同驱动 token 和 passport 的区别
相关:[PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth:airlock
Refer:Laravel为什么设计看起来复杂_用起来还可以