我正在使用烧瓶构建 REST API。我正在使用邮递员来测试在我的数据库中创建新项目的路由,但前提是用户已登录。注册和登录的路由运行良好,最后一个使用 flask_jwt_extended 模块返回令牌。当我向我的“/api/notes”(在数据库中创建一个新笔记)发送一个帖子请求时,我收到以下错误:
" (...) raise TypeError(f'Object of type {o. class . name } '
类型错误:函数类型的对象不是 JSON 可序列化的”
对于我使用邮递员授权选项卡的请求。类型:不记名令牌,以及我在字段中的令牌(带引号和不带引号都试过)
我今天早上遇到了这个错误,在实现我的一对多关系之前,但我通过在 Barear 令牌字段中用“VERY_LONG_TOKEN”替换我的 VERY_LONG_TOKEN 使其工作。我认为因为令牌包含点,所以它被解释为一个函数。但是实现关系后,我去测试,又报了这个错误。
我的 note.py 文件:
from flask import request, Response, jsonify
from app.models import User, Note
from flask_restful import Resource
from flask_jwt_extended import jwt_required, get_jwt_identity
class NotesApi(Resource):
def get(self):
notes = Note.objects().to_json()
return Response(notes, mimetype="application/json", status=200)
@jwt_required
def post(self): # post method I'm making a request for
print("fool") # this doesn't get printed -> not reaching …Run Code Online (Sandbox Code Playgroud) 我是 python/flask 的新手,我正在处理一对多关系。我尝试了一些解决方案但没有成功。我的问题是在“/add_about”路线中,我想获取创建这篇文章的 user_id 并能够看到数据库中反映的内容。
这是我的代码:
from flask import Blueprint, jsonify, request
from flask_jwt_extended import jwt_required, current_user, get_current_user, get_jwt_identity
from app import db
from models.about import About, AboutSchema
from models.users import User
about = Blueprint('about', __name__)
about_schema = AboutSchema()
abouts_schema = AboutSchema(many=True)
@about.route('/')
def hello():
return "Oh LA LA LA LA !!!!!!"
# Get all abouts:
@about.route('/all', methods=['GET'])
def abouts():
abouts_list = About.query.all()
result = abouts_schema.dump(abouts_list)
return jsonify(result)
@about.route('/add_about', methods=['POST'])
@jwt_required
def add_about():
description = request.form['description']
user_id = get_jwt_identity() #I …Run Code Online (Sandbox Code Playgroud) 我正在尝试从此处的代码刷新 JWT 令牌。问题在于如何通过刷新获取新令牌。
这有效:
curl http://127.0.0.1:5000/protected
{"msg":"Missing Authorization Header"}
Run Code Online (Sandbox Code Playgroud)
这有效,我得到了我的令牌并将其放入 ACCESS
curl -H "Content-Type: application/json" -X POST -d '{"username":"test","password":"test"}' http://localhost:5000/login
Run Code Online (Sandbox Code Playgroud)
这有效,我得到了我的用户名
curl -H "Authorization: Bearer $ACCESS" http://localhost:5000/protected
Run Code Online (Sandbox Code Playgroud)
但是,当令牌过期时,如何使用刷新令牌和/或访问令牌获取 curl 以获取新的访问令牌?我已经尝试了许多 POST,但似乎没有任何效果:
https://flask-jwt-extended.readthedocs.io/en/latest/refresh_tokens.html
from flask import Flask, jsonify, request
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token,
jwt_refresh_token_required, create_refresh_token,
get_jwt_identity
)
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret' # Change this!
jwt = JWTManager(app)
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if username != 'test' or password != …Run Code Online (Sandbox Code Playgroud) 这是我要测试的功能
@jwt_required
def get_all_projects(self):
# implementation not included here
Run Code Online (Sandbox Code Playgroud)
我从pytest类调用函数
def test_get_all_projects(db_session):
all_projects = ProjectController.get_all_projects()
Run Code Online (Sandbox Code Playgroud)
用db_session夹具
@pytest.fixture(scope='function')
def db_session(db, request):
"""Creates a new database session for a test."""
engine = create_engine(
DefaultConfig.SQLALCHEMY_DATABASE_URI,
connect_args={"options": "-c timezone=utc"})
DbSession = sessionmaker(bind=engine)
session = DbSession()
connection = engine.connect()
transaction = connection.begin()
options = dict(bind=connection, binds={})
session = db.create_scoped_session(options=options)
db.session = session
yield session
transaction.rollback()
connection.close()
session.remove()
Run Code Online (Sandbox Code Playgroud)
这导致错误
> raise NoAuthorizationError("Missing {} Header".format(header_name))
E flask_jwt_extended.exceptions.NoAuthorizationError: Missing Authorization Header
../../.virtualenvs/my-app/lib/python3.6/site-packages/flask_jwt_extended/view_decorators.py:132: NoAuthorizationError
Run Code Online (Sandbox Code Playgroud)
create_access_token当我调用 …
我在 Flask 应用程序中收到此错误:
curl http://0.0.0.0:8080/ -H "Authorization: Bearer TGazPL9rf3aIftplCYDTGDc8cbTd"
{
"msg": "Not enough segments"
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例:
from flask import Flask
from flask_restful import Resource, Api
from flask_jwt_extended import JWTManager, jwt_required
app = Flask(__name__)
jwt = JWTManager(app)
api = Api(app)
class HelloWorld(Resource):
@jwt_required
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
Run Code Online (Sandbox Code Playgroud)
安慰:
* Serving Flask app "app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active! …Run Code Online (Sandbox Code Playgroud) 我有一个有趣的问题.我将python与Flask一起用于身份验证服务,该服务使用flask_jwt_extended生成JWT令牌.这就是我如何使用Flask JWT Extended在Python中生成令牌.
identity = {
"firstname": user.firstname,
"lastname": user.lastname,
"email": user.email,
"uuid": user.user_uuid,
'user_id': user.id
}
access_token = create_access_token(identity=identity, fresh=True)
Run Code Online (Sandbox Code Playgroud)
在配置中,我指定了JWT密钥和JWT算法:
JWT_SECRET_KEY = "this-really-needs-to-be-changed"
JWT_ALGORITHM = "HS256"
Run Code Online (Sandbox Code Playgroud)
在Java中,我使用jjwt库(io.jsonwebtoken,jjwt,0.9.0)来解码我制作的JWT:
Claims userJWT = Jwts.parser()
.setSigningKey("this-really-needs-to-be-changed")
.parseClaimsJwt(token)
.getBody();
Run Code Online (Sandbox Code Playgroud)
但是在Java中我得到一个例外,如果我运行它,我真的不明白问题是什么,因为算法是相同的和令牌.
从几小时开始,我现在尝试弄清问题是什么,因为它对我没有意义,
例外:
: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
io.jsonwebtoken.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:354) ~[jjwt-0.9.0.jar!/:0.9.0] …Run Code Online (Sandbox Code Playgroud) 我有一个 SPA 应用程序,其中包含一个带有上传文件字段的表单。我有一个休息 API,其端点通过 Flask-extended-jwt JWT 进行保护。为了验证 REST 端点,我使用 @jwt_required。我也想验证上传请求。
由于客户端,我无法添加 Authorization Bearer 标头,因此我想在提交表单时将访问令牌添加为隐藏字段。
从表单中读取 JWT 访问令牌后,手动验证它的最佳方法是什么?
class Upload(Resource):
def post(self):
#TODO: check for access token
access_token = None
if 'access_token' in request.form and request.form['access_token']:
access_token = request.form['access_token']
else:
message = json.dumps({'message': 'Invalid or missing token', 'success': False})
return Response(response=message, status=401, mimetype='text/plain')
if access_token:
#TODO: validate_token(access_token)
Run Code Online (Sandbox Code Playgroud)
谢谢
我在尝试在我的应用程序中捕获格式错误的 JWT 错误时遇到问题。
我正在使用 flask_jwt_extended 并且当我发送手动创建的 JWT 时。我收到此错误消息:
Error on request:
Traceback (most recent call last):
File "/Users/desmondlim/.virtualenvs/rest-api/lib/python3.7/site-packages/jwt/api_jws.py", line 180, in _load
signing_input, crypto_segment = jwt.rsplit(b'.', 1)
ValueError: not enough values to unpack (expected 2, got 1)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/desmondlim/.virtualenvs/rest-api/lib/python3.7/site-packages/flask_restful/__init__.py", line 266, in error_router
return self.handle_error(e)
File "/Users/desmondlim/.virtualenvs/rest-api/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/desmondlim/.virtualenvs/rest-api/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/desmondlim/.virtualenvs/rest-api/lib/python3.7/site-packages/flask_restful/__init__.py", line 458, …Run Code Online (Sandbox Code Playgroud) 我有一个复杂的破折号应用程序,我想将其保留在受 JWT 保护的路线后面。我的最终目标是将它包含在单独路由上的 iframe 中,但我只希望用户能够获取 th dash 应用程序的 html,如果他们有访问令牌。
我已重试在获取请求中返回应用程序本身。
应用程序
import dash
from flask import Flask, jsonify, request
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token,
get_jwt_identity
)
server = Flask(__name__)
server.config['JWT_SECRET_KEY'] = 'super-secret' # Change this!
jwt = JWTManager(server)
@server.route('/login', methods=['POST'])
def login():
if not request.is_json:
return jsonify({"msg": "Missing JSON in request"}), 400
username = request.json.get('username', None)
password = request.json.get('password', None)
if not username:
return jsonify({"msg": "Missing username parameter"}), 400
if not password:
return jsonify({"msg": "Missing password parameter"}), 400 …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个 RESTful API 应用程序flask_restful,flask_jwt_extended用于用户授权并将flask_limiter用户的配额限制为 6/分钟。我的玩具/测试代码如下(尚未实施实际的授权方案):
from flask import Flask, make_response
from flask_restful import Api, Resource
from flask_limiter import Limiter
from werkzeug.exceptions import HTTPException
from flask_jwt_extended import jwt_required, create_access_token, JWTManager, get_jwt_identity
# custom HTTP exception
class OutOfQuota(HTTPException):
code = 402
name = 'Out Of Quota'
app = Flask(__name__)
limiter = Limiter(app, key_func=get_jwt_identity)
api = Api(prefix='')
class Token(Resource):
def get(self, user):
return make_response({'token': create_access_token(identity=user)})
class Test(Resource):
@jwt_required
@limiter.limit('6/minute')
def get(self):
return make_response({'message': f'OK {get_jwt_identity()}'})
api.add_resource(Token, '/token/<string:user>') …Run Code Online (Sandbox Code Playgroud) flask ×8
python ×7
flask-jwt ×2
jwt ×2
python-3.x ×2
java ×1
jwt-auth ×1
mongodb ×1
plotly-dash ×1
pyjwt ×1
pytest ×1
sqlalchemy ×1