【问题标题】:Laravel 5.4 API route 302 with Tymon JWT middlewareLaravel 5.4 API 路由 302 和 Tymon JWT 中间件
【发布时间】:2017-10-17 12:38:22
【问题描述】:

我正在尝试使用Tymon JWT 包对 API.php 文件的路由进行简单测试:

Route::group(['middleware' => [ 'jwt.auth' ] ], function ()
{
  Route::group(['prefix' => 'auth', 'namespace' => 'Auth'], function () {
      Route::post('get-user')
        ->name('auth.get_user')
        ->uses('LoginController@getAuthenticatedUser');
  });
});

LoginController@getAuthenticatedUser如下:

// Get authenticated user
public function getAuthenticatedUser()
{
    try {

      if (! $user = JWTAuth::parseToken()->authenticate()) {
        return response()->json(['user_not_found'], 404);
      }

    } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

        return response()->json(['token_expired'], $e->getStatusCode());

    } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

        return response()->json(['token_invalid'], $e->getStatusCode());

    } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {

        return response()->json(['token_absent'], $e->getStatusCode());

    }

    // the token is valid and we have found the user via the sub claim
    return response()->json(compact('user'));
}

我已经测试了代码,我认为错误的结论是,在包的中间件上,如果我抓住 $user,我会在路由上获得 302 状态,否则一切顺利:

public function handle($request, \Closure $next)
{
    if (! $token = $this->auth->setRequest($request)->getToken()) {
        return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
    }

    try {
        $user = $this->auth->authenticate($token);
    } catch (TokenExpiredException $e) {
        return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
    } catch (JWTException $e) {
        return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
    }

    if (! $user) {
        return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
    }

    $this->events->fire('tymon.jwt.valid', $user);

    return $next($request);
}

我正在正确发送 JWT。我可以通过在上面的代码中记录 $user 变量并检查数据是否正确来证明这一点。

这是 Http/内核:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
        /**
         * The application's global HTTP middleware stack.
         *
         * These middleware are run during every request to your application.
         *
         * @var array
         */
        protected $middleware = [
                \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
                \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
                \App\Http\Middleware\TrimStrings::class,
                \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        ];

        /**
         * The application's route middleware groups.
         *
         * @var array
         */
        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,
                        \Illuminate\Routing\Middleware\SubstituteBindings::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,
                'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::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,

                'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
                'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class,
        ];
}

以下是路线截图:

我不知道下一步该去哪里,有什么想法吗?

【问题讨论】:

  • 你能粘贴到你的 Http/Kernel.php 文件吗?
  • 你好@Trent 谢谢你的问题。我已经编辑了我的帖子。
  • 您的路线在webapi 组中吗?
  • 你好@DovBenyominSohacheski。路由在 api 组中,因为那是 api.php 文件。

标签: php laravel laravel-5 jwt


【解决方案1】:

这里的问题归结为在路由中有来宾中间件。

如果我使用没有“来宾”中间件的路由,一切都会相应地工作。

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 2017-06-29
    • 2017-07-29
    • 2018-10-21
    • 2017-09-20
    • 2016-03-18
    • 2017-09-01
    • 2017-10-12
    • 2018-04-13
    相关资源
    最近更新 更多