1

我将 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方法并首先检查我自己的东西。

4

2 回答 2

6

我可以告诉你为什么会这样。

app\Http\Kernel.php带有中间件配置的文件在注册服务提供者之前被调用。

因此,Tymon JWT 服务提供者会在之后被调用,并为以下各项设置中间件别名:

  • 'jwt.auth' => Tymon\JWTAuth\Http\Middleware\Authenticate::class,
  • 'jwt.check' => Tymon\JWTAuth\Http\Middleware\Check::class,
  • 'jwt.refresh' => Tymon\JWTAuth\Http\Middleware\RefreshToken::class,
  • 'jwt.renew' => Tymon\JWTAuth\Http\Middleware\AuthenticateAndRenew::class,

从而覆盖您的密钥。

因此,使用另一个中间件密钥是使用您自己的实现的正确方法。

于 2019-03-23T19:57:41.720 回答
0

我重命名了中间件路由组并更改了

Route::middleware(['jwt.auth'])->group(function() {

Route::middleware(['jwt.authenticate'])->group(function() {

'jwt.auth' => \App\Http\Middleware\JWTAuthenticate::class

'jwt.authenticate' => \App\Http\Middleware\JWTAuthenticate::class

jwt.auth并且不再调用原来的。我不知道为什么,但我现在可以在我的中间件中控制它。

于 2019-03-23T17:47:47.677 回答