Flask RESTful 销毁用户令牌

Posted

技术标签:

【中文标题】Flask RESTful 销毁用户令牌【英文标题】:Flask RESTful Destroy User Token 【发布时间】:2015-01-15 23:09:02 【问题描述】:

我正在设置一个 Flask-RESTful 服务并让用户身份验证正常工作。我使用的方法是:

def generate_auth_token(username, expiration=600):
    gen_serial = Serializer(secret_key, expires_in=expiration)
    return gen_serial.dumps('username': username)

我将令牌传递给用户如下:

class token(Resource):
    decorators = [auth.login_required]
    def post(self):
        username = g.user
        return_token = generate_auth_token(username)
        return 'token':return_token.decode(), 200

然后验证令牌,这样它就不需要存储在服务器端:

def verify_auth_token(auth_token):
    serial = Serializer(secret_key)
    try:
        data = serial.loads(auth_token)
    except SignatureExpired:
        return None 
    except BadSignature:
        return None 
    serial_user = data['username']
    return serial_user

这似乎运作良好,但是我不确定如何在到期之前注销用户而不存储令牌服务器端。我的想法是在用户选择注销时传回垃圾令牌,但我认为这不是一个优雅或安全的解决方案。

任何提示都会非常有帮助!

【问题讨论】:

这是用户发起的注销还是服务器发起的注销? 我的目标是用户发起。目标是让用户在完成工作后单击注销,否则令牌将在一段时间后过期。 【参考方案1】:

而不是垃圾令牌简单地不编码数据:

def generate_auth_token(username=None, expiration=600):
    gen_serial = Serializer(secret_key, expires_in=expiration)
    data = 'username': username if username is not None else 
    return gen_serial.dumps(data)

然后你可以有一个invalidate 端点,它需要登录并返回一个没有用户名的令牌:

def invalidate(self):
    return_token = generate_auth_token()
    return 'token':return_token.decode(), 200

此时,您可以处理可能缺少的用户名字段:

def verify_auth_token(auth_token):
    serial = Serializer(secret_key)
    try:
        data = serial.loads(auth_token)
    except SignatureExpired:
        return None 
    except BadSignature:
        return None 
    serial_user = data.get('username')
    return serial_user

【讨论】:

谢谢!等待一些测试,我认为这应该很好。 @Sean:也许我不理解 OP 问题,但是您的解决方案如何在有效令牌过期之前使其无效?我可以得到一个有效的token,然后调用invalidate()端点,原来的token在过期前仍然有效可用。对吗? @Miguel - 正确。客户想要摆脱它的令牌,所以它可以直接放弃它,但 OP 希望能够明确地“以旧换新”令牌。但是恶意客户端或中间人仍然可以使用有效令牌,直到它过期。

以上是关于Flask RESTful 销毁用户令牌的主要内容,如果未能解决你的问题,请参考以下文章

发送带有承载令牌授权标头 (flask_restful + flask_jwt_extended) 的 GET 消息时出现“段不足”

如何使用 Flask-USER 管理保护 Flask-RESTful?

Python3 - 初探 Flask-Restful

Python3 - 初探 Flask-Restful

使用flask-jwt-extended回调与flask-restful和create_app

我啥时候应该销毁令牌[关闭]