问题描述
我是编码新手。我已经使用 Flask
在 flask-JWT
内设置了登录功能。到目前为止,我能够登录(在“/login”上)并使用 jwt
生成令牌。
但是,我还有其他路由也使用包装器 (@token_required) 进行保护。我想让用户登录后,令牌将被传递到其他受保护的页面,然后他们就可以访问这些页面。
这些是我的代码:
用于保护页面的包装器
def token_required(f): #wrapper for token auth
@wraps(f)
def decorated(*args,**kwargs):
token = request.args.get('token')
if 'x-access-token' in request.headers:
token = request.headers['x-access-token']
if not token:
return jsonify({'message': 'Token is missing!'}),401
try:
data = jwt.decode(token,app.config['SECRET_KEY'],algorithms=["HS256"])
current_u = User.query.filter_by(username=data['user']).first()
#identify user,otherwise,return error
except:
return jsonify({'message': 'Token is invalid!'}),401
return f(current_u,*args,**kwargs) #prevIoUsly return f(*args,**kwargs)
return decorated
登录路径
@app.route('/login',methods=['GET','POST']) #login route
def login():
auth = request.authorization
if not auth or not auth.username or not auth.password:
return make_response('Could not verify',401,{'WWW-Authenticate': 'Basic realm = "Login required!"'})
user = User.query.filter_by(username=auth.username).first()
if not user:
return make_response('Could not verify',{'WWW-Authenticate': 'Basic realm = "Login required!"'})
if user.check_password(auth.password):
token = jwt.encode({'user': auth.username,'exp': datetime.datetime.utcNow() + datetime.timedelta(minutes=2)},app.config['SECRET_KEY'])
return jsonify({'message': 'hello ' + user.username},{'token': token})
return make_response('Could not verify',{'WWW-Authenticate': 'Basic realm = "Login required!"'})
使用包装器保护路由
@app.route('/protected') #protected routes
@token_required
def protected(current_u):
return jsonify({'message' : 'This is only for people with valid tokens'})
我只是停留在这个时间点,因为我无法找到专门为此的教程/也许这也是一个不知道要搜索什么的问题。有人可以帮我吗?
解决方法
进一步认为我不认为使用会话是必要的,因为身份验证是在 jwt 令牌中编码的。我认为您的错误在于装饰器
try:
data = jwt.decode(token,app.config['SECRET_KEY'],algorithms=["HS256"])
except:
return jsonify({'message': 'Token is invalid!'}),401
这个except子句太宽泛了,这里需要处理什么异常?