我正在为我的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 传递给响应正文。坚强>可以说吗?
您是否发现这种方法存在严重漏洞?
我是否忘了过程中的重要事项?
预先感谢您的帮助和见解。