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

Posted

技术标签:

【中文标题】如何在纯 php 中创建刷新令牌?【英文标题】:How to create a refresh token in plain php? 【发布时间】:2018-09-15 04:50:13 【问题描述】:

我一直在网上搜索有关如何自己生成刷新令牌的示例/说明。不使用任何服务,如 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】:

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

我把那个 uuid 作为“刷新令牌”存储在本地存储中。 而且我还存储在一个数据库中,其中包含一个表: 身份证 |用户 ID |刷新令牌 |到期日期 因此,每当 JWT 过期时,我都会使用持久刷新令牌并检查数据库中是否存在该刷新令牌以及它是否未过期。 然后我发回了一个新的 JWT 以及一个新的刷新令牌。

【讨论】:

把你想出的例子举起来怎么样? 如果您使用 JWT,我什至不确定您的数据库中是否需要 ID/user_id。 user_id 可能已经在访问令牌中可用。我不确定这是实现它的好方法,我刚刚开始阅读有关该主题的内容。 不要在 localStorage 中存储刷新令牌。这样做是一个巨大的安全漏洞。您应该将其存储在 httpOnly cookie 中。 @MarceloFonseca 不要忘记 XSRF 漏洞,请参阅此处的说明Angular Blog - Disadvantages of Cookies - XSRF

以上是关于如何在纯 php 中创建刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 5 中创建 JWT 令牌?

如何在没有用户名/密码的nodejs中创建JWT用户/访问令牌?

在 Java 中创建 JSON Web 令牌

c_cpp 在纯C ++中创建COM对象

在 jquery 令牌输入中创建令牌

在Firebase中创建用户后获取身份提供商令牌