标签: flask-jwt-extended

TypeError:使用flask_jwt_extended int RESTful API 时,函数类型的对象不是JSON 可序列化的

我正在使用烧瓶构建 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 mongodb flask flask-restful flask-jwt-extended

12
推荐指数
1
解决办法
2401
查看次数

如何在flask-jwt-extended中获取当前用户(id)?

我是 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)

python sqlalchemy flask flask-sqlalchemy flask-jwt-extended

9
推荐指数
1
解决办法
1万
查看次数

如何将刷新令牌发布到 Flask JWT Extended?

我正在尝试从此处的代码刷新 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)

python flask flask-jwt-extended

7
推荐指数
1
解决办法
6960
查看次数

flask-jwt-extended:测试期间的伪授权头(pytest)

这是我要测试的功能

@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

当我调用 …

python pytest flask flask-jwt flask-jwt-extended

6
推荐指数
2
解决办法
2583
查看次数

使用承载令牌授权标头(flask_restful +flask_jwt_extended)发送 GET 消息时出现“段不足”

我在 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)

flask flask-restful pyjwt flask-jwt-extended jwt-auth

6
推荐指数
1
解决办法
9704
查看次数

使用Java在Java中创建的JWT令牌

我有一个有趣的问题.我将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)

python java jwt flask-jwt-extended

5
推荐指数
1
解决办法
857
查看次数

手动验证flask-extended-jwt的访问令牌

我有一个 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)

谢谢

flask flask-jwt flask-jwt-extended

5
推荐指数
1
解决办法
2291
查看次数

flask_jwt_extended 在解码我的 JWT 时抛出错误。我怎样才能捕捉到它?

我在尝试在我的应用程序中捕获格式错误的 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)

python-3.x jwt flask-restful flask-jwt-extended

5
推荐指数
2
解决办法
2804
查看次数

如何在受保护的路线后面保持 Plotly dash 应用程序

我有一个复杂的破折号应用程序,我想将其保留在受 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)

python flask plotly-dash flask-jwt-extended

5
推荐指数
1
解决办法
1168
查看次数

Flask-Limiter 不适用于基于 Flask-Restful API 的应用程序

我正在尝试构建一个 RESTful API 应用程序flask_restfulflask_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)

python flask python-3.x flask-restful flask-jwt-extended

5
推荐指数
1
解决办法
2886
查看次数