我刚刚尝试使用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;令牌已过期
我不明白。
答案 0 :(得分:2)
访问令牌过期后,您可以使用刷新令牌获取新的访问令牌,而无需要求用户再次输入其用户名和密码。 只有在刷新令牌过期后,用户才需要再次登录。
但是3小时后,如果我尝试查询某些内容,则表示“令牌已过期”。
那是因为访问令牌已过期。
这个系统是否意味着,用户必须在每小时内更新/刷新他的令牌,但限制为2周?我不明白。
是肯定的。您将刷新令牌保留在客户端系统中,并在访问令牌过期时使用它来请求新的访问令牌。
答案 1 :(得分:1)
这是我为我所做的,通过执行此操作,我必须将令牌时间设置为24小时有效
'ttl' => env('JWT_TTL', 1400)
我将60更改为1440,现在我的令牌持续了一天。
答案 2 :(得分:0)
好的,最后我有一些有用的东西。
从中间件中删除“jwt.refresh”。这是针对一次通过代币的,如上所述。
我无法使用JWTAuth :: refresh()来启用黑名单。当我调用JWTAuth :: refresh()时,抛出“TokenBlacklistedException”,即使我知道它仅在“TokenExpiredException”的catch块中执行此操作已过期。错误?解决方法:
JWT_BLACKLIST_ENABLED=false
如果/ test返回401,你需要有一个可以调用的刷新端点。我使用相同的登录,但在我的情况下它是一种自定义。
... 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 } ...