如何在纯PHP中创建刷新令牌?

时间:2018-04-05 11:20:21

标签: php jwt token refresh

我一直在网上搜索关于如何自己生成刷新令牌的示例/解释。不使用像Oauth等任何服务。只是在简单的PHP。 我发现了很多关于如何使用它们的信息,但没有找到如何创建它们的信息。

我创建了一个像这样的JWT:

$secret = "secret";

$header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);

function createJWT($user_id){
    $date = new DateTime();
    $timestamp = $date->getTimestamp();

    global $header;
    global $secret;
    $payload = ['user_id' => $user_id, 'iat'=> $timestamp, 'exp'=>$timestamp+10];
    $payload = json_encode( $payload );
    $base64UrlHeader = str_replace(['+','/','='], ['-','_',''], base64_encode($header));
    $base64UrlPayload = str_replace(['+','/','='], ['-','_',''], base64_encode($payload));
    $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secret);
    $base64UrlSignature = str_replace(['+','/','='], ['-','_',''], base64_encode($signature));
    $JWT =$base64UrlHeader . '.' . $base64UrlPayload . '.' . $base64UrlSignature;

    return $JWT;
}

在查看jwt.io调试器时,它可以正常工作。

但是因为我想使用刷新令牌所以我可以在它们过期后“创建”更多的访问令牌,但我找不到任何关于如何创建这样的令牌的信息。

我理解访问令牌存储在本地存储/ cookie中,而刷新令牌存储在数据库中。

如何创建刷新令牌,它包含哪些信息?我想这不仅仅是一个随机字符串。存储刷新令牌的数据库/表的模式a是什么样的?

1 个答案:

答案 0 :(得分:3)

我查看了JWT的文档,看起来你只需创建一个uuid,guid,它只是一个几乎不可能破解的uniq值/字符串。

我拿了那个uuid并将其作为“refresh-token”存储在本地存储中。 我还在一个DB中存储了一个包含以下内容的表: ID | user_id | refresh-token |到期日期 因此,每当JWT过期时,我都会使用持久的刷新令牌并检查数据库中是否存在该刷新令牌以及它是否已过期。 然后我发回了一个新的JWT以及一个新的刷新令牌。