我正在设置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
这似乎运行良好,但是我不确定如何在到期过期之前注销用户而不存储令牌服务器端。我的想法是在用户选择退出时传回垃圾令牌,但我不认为这是一个优雅或安全的解决方案。
任何提示都会非常有用!
答案 0 :(得分: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