【问题标题】:jwt-auth token has expiredjwt-auth 令牌已过期
【发布时间】:2019-08-08 13:23:33
【问题描述】:

我正在为我的 SPA 使用 jwt-auth 和 vue-auth。出于测试目的,我将 vue-auth 的配置文件中的 refreshData 变量设置为 1,以便每分钟刷新一次。对于 jwt-auth 配置文件,我将 ttl 设置为 1,将 refresh_ttl 设置为 3。

我能够登录并接收令牌。我在本地存储中看到它。前 3 分钟的每一分钟,我都会成功刷新,我看到 localStorage 中的令牌发生变化,但第四次出现错误。

{message: "Token has expired and can no longer be refreshed",…}
exception: "Tymon\JWTAuth\Exceptions\TokenExpiredException"

这是为什么?由于我正在刷新令牌,我认为 refresh_ttl 甚至都无关紧要,但它似乎确实在规定这一点。

【问题讨论】:

    标签: laravel vue.js jwt jwt-auth


    【解决方案1】:

    在你的 AuthController 中尝试改变

    $this->middleware('auth:api', ['except' => ['login']]);
    

    进入

    $this->middleware('auth:api', ['except' => ['login', 'refresh']]);
    

    【讨论】:

      【解决方案2】:

      请在您的身份验证控制器刷新功能中进行更改:

      return response()->json([
              "success" => true,
              "payload" => [
                  'access_token' => auth()->refresh(),
                  'token_type' => 'bearer',
                  'expires_in' => auth()->factory()->getTTL() * 60,
                  'user' => auth()->user()
              ]
          ]);
      

      你需要像这样改变你的 config/auth.php:

          'defaults' => [
          'guard' => 'api',
          'passwords' => 'users',
      ],
      'guards' => [
          'web' => [
              'driver' => 'session',
              'provider' => 'users',
          ],
          'api' => [
              'driver' => 'jwt',
              'provider' => 'users',
              'hash' => false,
          ],
      ],
      

      这是一个很好的例子laravel-jwt-vuejs

      【讨论】:

        【解决方案3】:

        如果您不想让令牌过期,请在配置 jwt.php 中替换

         'ttl' => env('JWT_TTL', null),
        
        
         'required_claims' => [
                'iss',
                'iat',
                // 'exp',
                'nbf',
                'sub',
                'jti',
            ],
        

        然后点击

        php artisan config:cache
        

        【讨论】:

          【解决方案4】:

          您可以将 ttl 设置为 null,以生成永不过期的令牌。

          'ttl' => env('JWT_TTL', null),
          

          或者直接在.env中给出

          【讨论】:

            【解决方案5】:

            你不能使用那个包来做到这一点。您可以做的是将 config/jwt.php 文件中的过期时间设置为 7 天,这样如果用户验证令牌将在 7 天后过期。

            'ttl' => env('JWT_TTL', 60*24*7),
            

            值以分钟为单位。

            【讨论】:

              【解决方案6】:

              我遇到了同样的问题,并且尝试了我在网上可以找到的所有内容,但没有任何效果。于是我自己研究了config/jwt.php文件,通过修改文件这行来解决:

              'refresh_ttl' => env ('JWT_REFRESH_TTL', 20160),
              

              作者:

              'refresh_ttl' => env ('JWT_REFRESH_TTL', Null),
              

              之前我也修改了这一行:

              'ttl' => env ('JWT_TTL', 60),
              

              作者:

              'ttl' => env ('JWT_TTL', NULL),
              

              希望它可以帮助其他人:)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-03-20
                • 2018-07-20
                • 2017-03-04
                • 2019-07-04
                • 2019-09-28
                • 2017-08-18
                • 2018-06-19
                • 1970-01-01
                相关资源
                最近更新 更多