我正在使用flask-restful开发一个API。我想确保当用户登录时,除非他首先注销,否则他无法再次登录。我正在使用 flask-jwt-extended 并且想知道是否有办法在尝试登录之前检查用户已经登录的位置。
您可以尝试使用jwt_optional装饰器,但如果令牌过期或无效,它将引发错误:
@app.route('/hello')
@jwt_optional
def hello():
user = get_gwt_identity()
或者只是检查令牌是否有效并返回用户。如果令牌无效,用户将无:
from flask_jwt_extended import get_jwt_identity, verify_jwt_in_request_optional
def get_identity_if_logedin():
try:
verify_jwt_in_request_optional()
return get_jwt_identity()
except Exception:
pass
@app.route('/hello')
def hello():
user = get_identity_if_logedin()
# check if user is loged in
if user:
# user var here has jwt_identity
一种选择可能是在基本路由上使用jwt_optional装饰器,并在用户未登录时返回重定向到登录页面:http://flask-jwt-extended.readthedocs.io/en/latest/optional_endpoints.html
如果后端只是一个API,更好的选择可能是在前端(在本地存储或保存它的任何位置(中查找访问令牌,并放置是否应该显示登录页面的逻辑。
在受保护的终结点中,这将返回访问此终结点的 JWT 的标识。如果不存在 JWT,则返回None
。
请参阅 API 参考:
from flask_jwt_extended import jwt_required, jwt_optional, get_jwt_identity
if get_jwt_identity():
pass
从flask_login复制"if current_user is auth",则可以创建自定义装饰器。
def jwt_login_required():
def wrapper(fn):
@wraps(fn)
def decorator(*args, **kwargs):
jwt = verify_jwt_in_request(optional=True)
if(get_jwt_identity()):
return current_app.ensure_sync(fn)(*args, **kwargs)
else:
return redirect(url_for('login'))
return decorator
return wrapper
然后你可以在你的应用程序中使用它
@app.route("/hello")
@jwt_login_required()
def hello():
return render_template('/hello.html')