【问题标题】:Laravel 7.0 - tymon/jwt-auth - check if token is validLaravel 7.0 - tymon/jwt-auth - 检查令牌是否有效
【发布时间】:2020-07-04 17:04:06
【问题描述】:

尝试使用 tymon/jwt-auth (JWT) 在 laravel 安装中实现登录端点。登录,注销,获取用户数据工作正常。我想要一个端点来检查承载令牌。有一种简单的方法可以通过以下方式实现:

Route::get('/valid', function () {
    return 1;
})->middleware('auth:api');

如果令牌有效,则 HTTP 返回码 == 200,否则返回 401 码。由于端点正在检查令牌而不是经过身份验证的通信,我宁愿让控制器返回关于有效令牌的真/假 200 - OK。

我查看了模块的“幕后”,这就是我能走多远(不工作):

            $tokenKey = $request->bearerToken();
            $jws = \Namshi\JOSE\JWS::load($tokenKey);

            $jwsSimple = new SimpleJWS($jws->getHeader());
            $jwsSimple::load($tokenKey);
            $jwsSimple->setPayload($jws->getPayload());
            $jwsSimple->setEncodedSignature(explode('.', $tokenKey)[2]);

            $tmpVal = $jwsSimple->isValid($tokenKey);

有没有更好的方法来实现这一点?我认为应该有一个服务提供商,但无法弄清楚如何实现这一点。提前谢谢你。

【问题讨论】:

    标签: laravel jwt jwt-auth


    【解决方案1】:

    // 验证令牌控制器:

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use Illuminate\Http\Request;
    
    class ValidTokenController extends Controller
    {
        public function __invoke(Request $request)
        {
            $response = auth('api')->check();
            $responseCode = 200;
            if(!$response) {
                try {
                   if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate()) {
                   $response = 0;
                   }
                } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
                   $response = -1;
                } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
                   $response = -2;
                } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
                   $response = -3;
                }
            } else {
                $response = (int) $response;
            }
            return response()->json($response, $responseCode);
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是使用 laravel 和 tymon/jwt-auth 实现基于状态的令牌验证的混合输出:

      <?php
      
      namespace App\Http\Controllers\Auth;
      
      use App\Http\Controllers\Controller;
      use Illuminate\Http\Request;
      
      class ValidTokenController extends Controller
      {
          public function __invoke(Request $request)
          {
              $response = (int) auth('api')->check();
              $responseCode = 200;
              try {
                  if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate()) {
                      $response = 0;
                  }
              } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {
                  $response = -1;
              } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {
                  $response = -2;
              } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
                  $response = -3;
              }
              return response()->json($response, $responseCode);
          }
      }
      

      【讨论】:

        【解决方案3】:

        你可以删除 auth:api 中间件,然后有类似的东西:

        return response()->json([ 'valid' => auth()->check() ]);
        

        【讨论】:

          【解决方案4】:

          也许这个方法需要你:

          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());
          
                              }
          
                              return response()->json(compact('user'));
                      }
          

          【讨论】:

          • 不得不像这样调整你的代码:if (!app(\Tymon\JWTAuth\JWTAuth::class)->parseToken()->authenticate()) 和异常绝对命名空间定义。在那之后,它就像一个魅力。将在下面发布最终解决方案。谢谢四位的帮助!
          猜你喜欢
          • 2018-03-04
          • 2018-10-21
          • 2018-11-28
          • 2021-09-08
          • 2016-10-20
          • 1970-01-01
          • 2017-06-10
          • 2015-11-19
          • 2020-05-11
          相关资源
          最近更新 更多