首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >get_jwt_identity()在Flask-JWT-Extended中返回None

get_jwt_identity()在Flask-JWT-Extended中返回None
EN

Stack Overflow用户
提问于 2019-02-26 07:24:25
回答 2查看 2.8K关注 0票数 2

我正在使用Flask-JWT-Extended来保护我的Flask API。在登录之后,在受保护的路由(add-user)中,我调用了get_jwt_identity(),但它返回None,因此我无法获取身份。

代码语言:javascript
复制
@flask_app.route('/<api_version>/login', methods=['POST'])
def login(api_version):
    print(f'login', request.form)
    response = None
    try:
        username = request.form['username']
        password = request.form['password']

        if not username:
            return jsonify({"msg": "Missing username parameter"}), 400
        if not password:
            return jsonify({"msg": "Missing password parameter"}), 400

        user = User.get_with_password(username, password)

        if (not user):
            e1 = Unauthorized(
                'Invalid username or password.  Please try again.')
            e1.status = 401
            raise e1

        """ flask_login.login_user(user, remember=True) """
        access_token = create_access_token(identity=username)
        response = json.dumps({"token": access_token}, cls=CustomJSONEncoder)
    except Exception as e:
        errMsg = f'Error Logging in user {username if username else ""}: {e}'
        status = e.status if hasattr(e, 'status') else 500
        print(f'{errMsg}')
        traceback.print_exc()
        return Response(
            json.dumps({"message": errMsg, "status": status, "stack": traceback.format_exc() }), status=status, mimetype='application/json')


    resp = Response(response, status=200, mimetype='application/json')
    return resp

@flask_app.route('/<api_version>/add-user', methods=['POST'])
@jwt_required
def add_user(api_version):
    print(f'add-user', request)
    response = None
    username = None
    password = None
    allow_admin = None
    try:
        data = request.get_json()
        print(f'add-user data', data)

        if 'username' in data:
            username = data['username']
        else:
            return jsonify({"msg": "Missing username parameter"}), 400
        if 'password' in data:
            password = data['password']
        else:
            return jsonify({"msg": "Missing password parameter"}), 400
        if 'allow_admin' in data:
            allow_admin = data['allow_admin']

        """ user = User.get_with_password(username, password)"""
        user = get_jwt_identity()
        print('user',user)

        if (not user):
            e1 = Unauthorized(
                'Invalid username or password.  Please try again.')
            e1.status = 401
            raise e1

        response = json.dumps({"user": user}, cls=CustomJSONEncoder)
    except Exception as e:
        errMsg = f'Error Adding User {username}: {e}'
        status = e.status if hasattr(e, 'status') else 500
        print(f'{errMsg}')
        traceback.print_exc()
        return Response(
            json.dumps({"message": errMsg, "status": status, "stack": traceback.format_exc() }), status=status, mimetype='application/json')


    resp = Response(response, status=200, mimetype='application/json')
    return resp

User.py

代码语言:javascript
复制
class User():
    @classmethod
    def get_with_password(cls, username, password):
        print(f'User get_with_password {username} with password')
        user_db = account.get_account(username)
        print(f'User returned from DB: {user_db}')

        user = User()
        if not user_db or not len(user_db) or (not 'password' in user_db):
            return None
        user.username = username
        user.id = username

        if bcrypt.check_password_hash(user_db['password'], password):

            user.role = user_db['role']
            #user.is_authenticated = True
            print(
                f'loginUser returning {vars(user)} ')
            return user
        return None
EN

回答 2

Stack Overflow用户

发布于 2019-09-24 17:45:44

我也遇到了同样的问题,在我的例子中,我忘记添加@jwt_required

代码语言:javascript
复制
@jwt_required
def get(self):
    uid = get_jwt_identity()
    print("self.uid",uid)

在您的代码中有@jwt_required,检查令牌可能已过期

票数 1
EN

Stack Overflow用户

发布于 2020-09-10 19:49:27

我得到了同样的问题,并通过以下步骤解决了它

Step1:检查您是否像下面这样包装了您的应用程序(flask_app)。

代码语言:javascript
复制
from flask_jwt_extended import JWTManager
jwt = JWTManager(flask_app)

Step2:检查你的应用程序中是否有JWT_BLACKLIST_ENABLED。

如果你的应用程序中没有JWT_BLACKLIST_ENABLED = False或者JWT_BLACKLIST_ENABLED,那么在你使用过create_token_method()的地方添加下面的方法(在你的例子中是登录方法)。

代码语言:javascript
复制
@jwt.user_claims_loader
def add_claims_to_access_token(identity):
    return {
        'identity': identity
    }

如果JWT_BLACKLIST_ENABLED = True,那么还可以在登录方法上添加以下内容。

代码语言:javascript
复制
@jwt.token_in_blacklist_loader
def check_if_token_in_blacklist(decrypted_token):
    jti = decrypted_token['jti']
    return jti in blacklist
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54876250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档