我将 Laravel 5.7 用于一些 api。我还使用包https://github.com/tymondesigns/jwt-auth来生成 JWT 令牌来验证用户。我很久以前就配置了所有东西,而且效果很好。
RouteServiceProvider.php
我在下面注册了路由组routes/api_v1.php
:
Route::prefix('api/v1')
->middleware('api')
->namespace($this->namespace.'\API\V1')
->group(base_path('routes/api_v1.php'));
在config.auth.php
我有带有驱动程序 jwt 的 api_v1 保护:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api_v1' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
我已经App/User.php
实现Tymon\JWTAuth\Contracts\JWTSubject
并实现了这两种方法。
但是当app/Http/Kernel.php
我在中间件数组中添加时:
protected $routeMiddleware = [
// previous middlewares,
'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class
];
routes/api_v1.php
该组下的路线jwt.auth
:
Route::middleware(['jwt.auth'])->group(function() {
// Keep auto resource route at bottom to prevent route conflict with Show parameter route
foreach(Controller::$resourceModels as $key => $model) {
//Route::post($key.'/{id}/patch', $model.'Controller@patchUpdate');
Route::resource($key, $model.'Controller');
}
});
永远不会到达中间件App\Http\Middleware\JWTAuthenticate::class
,但总是去原始的 tymon 包中间件Tymon\JWTAuth\Http\Middleware\Authenticate::class
。
即使我没有将 api 驱动程序放在auth.php
配置中的 jwt 中,并且我没有jwt.auth
在中间件中放置任何类,它也可以与原始中间件一起正常工作。
我需要的是 Routes 组去我自己的中间件类App/Http/Middlewares/JWTAuthenticate
:
<?php
namespace App\Http\Middleware;
use Tymon\JWTAuth\Http\Middleware\Authenticate;
use Closure;
class JWTAuthenticate extends Authenticate
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
*
* @return mixed
*/
public function handle($request, Closure $next)
{
// My own logics here
// ...
$this->authenticate($request);
return $next($request);
}
}
这样我就可以覆盖handle
方法并首先检查我自己的东西。