3

我正在设置一个 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

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

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

4

1 回答 1

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
于 2014-11-18T18:32:18.523 回答