我试图围绕基于 JWT(JSON Web 令牌)的身份验证来使用访问令牌保护 API 端点。我通过要求用户拥有有效的访问令牌以获得所述资源来保护这些端点。
但是,我正在努力理解使用刷新令牌。
我有一个接受POST请求的 /auth/login 端点:
class UserLogin(Resource):
def post(self):
data = parser.parse_args()
current_user = User.find_by_username(data['username'])
if not current_user:
return {'message': 'Unsuccessful. You do not have an account'}
if User.verify_hash(data['password'], current_user.password):
access_token = create_access_token(current_user)
refresh_token = create_refresh_token(current_user)
return {
'message': 'Login successful {}'.format(current_user.username),
'roles': 'Role: {}'.format(current_user.role),
'access token': access_token,
'refresh token': refresh_token
}
else:
return {'message': 'Something went wrong'}
端点本质上检查传入的凭据以确保用户存在于我的用户存储中。如果他们这样做,我将返回一个访问和刷新令牌。否则,错误消息将被客户端处理。
现在,假设用户已经登录并尝试从另一个需要访问令牌来保护的端点访问私有资源。客户端将发出请求,受保护的端点将返回一些错误消息,说明它们没有访问令牌。然后,客户端将尝试使用登录时获得的刷新令牌生成新的访问令牌:
class TokenRefresh(Resource):
@jwt_refresh_token_required
def post(self):
current_user = get_jwt_identity()
access_token = create_access_token(identity=current_user)
return {'access token': access_token}
点击上述资源将生成一个新的访问令牌,其中包含一些已定义的过期时间。这是我目前的流程。
我的问题是,我应该如何存储刷新令牌以确保经过身份验证的用户可以访问它们?我的登录请求中是否应该有一些额外的逻辑,将生成的刷新令牌存储给该特定用户?
如果是这样,我是否应该在每次客户端尝试刷新其访问令牌时生成一个新的刷新令牌并覆盖附加到用户的现有刷新令牌?
目前,我觉得如果攻击者设法获得刷新令牌,我的进程可能会受到损害。