如何正确实现带有刷新令牌的JWT身份验证?

问题描述

我正在为我的Web应用程序实施身份验证和授权服务,已经具有登录部分(创建访问和刷新令牌)。但是我很好奇维护用户访问的最佳实践是什么。我到目前为止所拥有的:

public function authenticate(string $login,string $password): array
{
        $subject = $this->subjectRepository->findByLogin($login);

        // Used for blacklisting tokens
        $sessionUuid = Uuid::uuid4();

        if (!$subject) {
            throw new UserNotFoundException();
        }

        // Skipped checking hash for simplicity as this is a sandBox
        if ($subject->getpassword() !== $password) {
            throw new InvalidCredentialsException();
        }

        // User is valid at this point

        // Sign access token
        $accesstoken = $this->jwtSigner->sign([
            'session_id' => $sessionUuid,'sub' => $subject->getUsername(),'exp' => (new \DateTime())->modify('+15minutes')->getTimestamp(),'iat' => (new \DateTime())->getTimestamp(),]);

        // Sign refresh token
        $refreshToken = $this->jwtSigner->sign([
            'session_id' => $sessionUuid,'exp' => (new \DateTime())->modify('+31days')->getTimestamp(),]);

        return [
            JsonWebToken::ACCESS_TOKEN => $accesstoken,JsonWebToken::REFRESH_TOKEN => $refreshToken,];
}

简要摘要,通过用户名查找用户,为“会话”创建新的UUID,以在数据库中查找刷新令牌(黑名单+清除用户会话功能)。检查凭据并签名2个令牌,15分钟有效访问令牌和31天刷新令牌(请对持续时间发表评论

由于访问令牌非常简单,因此我不会通过验证访问令牌是否有效。我想知道应该如何刷新访问令牌。

我应该通过相应的session_id找到刷新令牌,对其进行验证,创建新的刷新令牌(还是不创建?),并将新的访问令牌作为附加字段 access_token 传递给响应正文。坚强>可以说吗?

您是否发现这种方法存在严重漏洞?

我是否忘了过程中的重要事项?

预先感谢您的帮助和见解。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)