未使用 jwt_required 注释时,烧瓶路由请求授权标头
Posted
技术标签:
【中文标题】未使用 jwt_required 注释时,烧瓶路由请求授权标头【英文标题】:flask route requesting Authorization header when not annotated with jwt_required 【发布时间】:2017-10-15 17:37:57 【问题描述】:我正在使用 flask-jwt-extended 库通过以下途径为 API 提供授权:
@app.route('/<string:stage>/api/v2.0/unauth/token', methods=['POST'])
def get_token(stage):
username = request.json['username']
password = request.json['password']
user = get_user(username)
if user and user.password == password:
return jsonify('access_token': create_access_token(identity=username)), 200
else:
abort(401)
当我发出以下 CURL 请求时
curl -H "Content-Type: application/json" -X POST -d '"username":"android", "password":"59a07c1a-0ec9-41a0-9b96-2ff196f35f0c"' http://0.0.0.0:5000/staging/api/v2.0/unauth/token
服务器响应
"msg": "Missing Authorization Header"
尽管get_token
函数上没有jwt_required
注释。我知道传递给请求的用户名和密码是有效的,get_user
调用返回的对象是有效的,其他非 jwt_required-annotated 和 jwt_required-annotated 路由按预期工作。我尝试重命名端点,甚至将其在代码中移动到不同的位置,但无济于事。如何解决这个问题?
【问题讨论】:
您确定没有其他路线符合您的要求吗? 我是。搜索token
只会调出此功能,更改路线名称也不能解决问题。
仅此一点并不能证明太多,因为它可以被解释为一个论点。我建议在 flask shell
中运行 app.url_map.match("/staging/api/v2.0/unauth/token", method="POST")
并查看它的结果。
附带说明,您绝对不应该存储纯文本密码。
您是否在使用任何其他可能正在添加或处理路由的烧瓶扩展? (烧瓶不安,那种东西)
【参考方案1】:
我认为您的应用程序中肯定有其他事情发生。如果我们根据您那里的情况采取最低限度的申请,它可以正常工作:
from flask import Flask, jsonify, request, abort
from flask_jwt_extended import JWTManager, create_access_token
app = Flask(__name__)
app.secret_key = 'super-secret' # Change this!
# Setup the Flask-JWT-Extended extension
jwt = JWTManager(app)
@app.route('/<string:stage>/api/v2.0/unauth/token', methods=['POST'])
def get_token(stage):
username = request.json['username']
password = request.json['password']
if username == 'test' and password == 'test':
return jsonify('access_token': create_access_token(identity=username)), 200
else:
abort(401)
if __name__ == '__main__':
app.run()
和
$ curl -H "Content-Type: application/json" -X POST -d '"username":"test", "password":"test"' http://0.0.0.0:5000/staging/api/v2.0/unauth/token
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0OTQ5NTI3MjMsImlhdCI6MTQ5NDk1MTgyMywibmJmIjoxNDk0OTUxODIzLCJqdGkiOiJhMTM0ZjU0MS03NDliLTRjODctYTA1ZC02NDU0MDBlMTQ2YTIiLCJpZGVudGl0eSI6InRlc3QiLCJmcmVzaCI6ZmFsc2UsInR5cGUiOiJhY2Nlc3MiLCJ1c2VyX2NsYWltcyI6e319.rXyi7p97tiplzyPq_7AtDsu0gUlrOhQmcak9bn2LOaU"
如果您可以发布更多代码,也许我们可以帮助追踪发生了什么?
此外,为了反映 Sven 所说的,您永远不应该以纯文本形式存储/比较密码。如果这只是作为发布到 *** 的示例,那么没问题。但如果你的真实代码是相同的,你应该考虑对你的密码进行加盐和哈希处理。
【讨论】:
感谢大家的帮助。原来对get_user
的调用导致了问题。我将方法重命名为get_user_by_username
,它可以工作。以上是关于未使用 jwt_required 注释时,烧瓶路由请求授权标头的主要内容,如果未能解决你的问题,请参考以下文章
Flask 学习-29.flask_jwt_extended插件jwt_required()中可选项optional=True参数