我不明白JWT刷新令牌的行为(LARAVEL)

时间:2016-12-25 23:29:04

标签: php laravel jwt

我刚刚尝试使用LARAVEL和https://github.com/tymondesigns/jwt-auth

进行JWT身份验证

但是我无法理解。在他们的配置中,他们提出:

'ttl' => env('JWT_TTL', 60), // in munutes
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), // in minutes

我的理解:令牌的直播时间为1小时,可在2周内刷新

但是3小时后,如果我尝试查询某些内容,则表示“令牌已过期”。

这个系统是否意味着,用户必须在每小时内更新/刷新他的令牌,但限制为2周?我不明白。

用户如何使用此类系统持续登录?刷新令牌在第一个小时后如何有用,虽然还没有2周,但是我无法获得新的令牌?

感谢

更新:代码

配置/ jwt.php

'ttl' => 2, // 2 minutes
'refresh_ttl' => 5, // 5 minutes

路由/ api.php

Route::post('/login', 'AuthController@login');
Route::get('/test', 'AuthController@test')->middleware('jwt.auth', 'jwt.refresh');

HTTP /控制器/ AuthController

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;

class AuthController extends Controller
{
    public function test()
    {
        return response()->json(['coucou' => 1]);
    }

    public function login(Request $request)
    {
        // grab credentials from the request
        $credentials = $request->only('email', 'password');

        try {
            // attempt to verify the credentials and create a token for the user
            if (! $token = JWTAuth::attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        // all good so return the token
        return response()->json(compact('token'));
    }
}

这就是流程:

使用{username:xxx,密码:xxx}

请求 / login / login 响应> {token:xxxxxxx}

使用承载xxxxxx ,在<10秒后直接

/ test / test / test 响应&gt;在HEADER中使用NEW TOKEN的好json响应

3分钟后

请求 / test (现在过去3分10秒,不到刷新限制的5分钟) / test 响应&gt;令牌已过期

我不明白。

3 个答案:

答案 0 :(得分:2)

访问令牌过期后,您可以使用刷新令牌获取新的访问令牌,而无需要求用户再次输入其用户名和密码。 只有在刷新令牌过期后,用户才需要再次登录。

  

但是3小时后,如果我尝试查询某些内容,则表示“令牌已过期”。

那是因为访问令牌已过期。

  

这个系统是否意味着,用户必须在每小时内更新/刷新他的令牌,但限制为2周?我不明白。

是肯定的。您将刷新令牌保留在客户端系统中,并在访问令牌过期时使用它来请求新的访问令牌。

答案 1 :(得分:1)

这是我为我所做的,通过执行此操作,我必须将令牌时间设置为24小时有效

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

我将60更改为1440,现在我的令牌持续了一天。

答案 2 :(得分:0)

好的,最后我有一些有用的东西。

  1. 从中间件中删除“jwt.refresh”。这是针对一次通过代币的,如上所述。

  2. 我无法使用JWTAuth :: refresh()来启用黑名单。当我调用JWTAuth :: refresh()时,抛出“TokenBlacklistedException”,即使我知道它仅在“TokenExpiredException”的catch块中执行此操作已过期。错误?解决方法:

    JWT_BLACKLIST_ENABLED=false

  3. 如果/ test返回401,你需要有一个可以调用的刷新端点。我使用相同的登录,但在我的情况下它是一种自定义。

  4. ...
        try
        {
          if($token = JWTAuth::getToken())
          {
            JWTAuth::checkOrFail();
          }
          $user = JWTAuth::authenticate();
        }
        catch(TokenExpiredException $e)
        {
          JWTAuth::setToken(JWTAuth::refresh());
          $user = JWTAuth::authenticate();
        }
        if($user /*&& check $user against parameter or not*/) 
        {
           return response()->json([
              'user' => $user->profile(),
              'accessToken'=> JWTAuth::getToken()->get(),
           ], 200);
        }
        else 
        {
            return response()->json(false, 401); //show login form
        } ...