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

时间:2020-08-24 13:11:51

标签: php authentication jwt authorization websecurity

我正在为我的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,
            'sub' => $subject->getUsername(),
            'exp' => (new \DateTime())->modify('+31days')->getTimestamp(),
            'iat' => (new \DateTime())->getTimestamp(),
        ]);

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

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

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

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

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

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

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

0 个答案:

没有答案