Flask 是否可以通过代码更改_default_jwt_payload_处理程序(标识)?

Flask 是否可以通过代码更改_default_jwt_payload_处理程序(标识)?,flask,identity,flask-jwt,Flask,Identity,Flask Jwt,我在应用程序中使用Flask JWT时遇到问题,我使用的身份验证和标识如下: def authenticate(username, password): session = db.Session() user = session.query(db.Operators).filter_by(username= username).first() if user and bcrypt.check_password_hash(user.password, password): re

我在应用程序中使用Flask JWT时遇到问题,我使用的身份验证和标识如下:

def authenticate(username, password):
  session = db.Session()
  user = session.query(db.Operators).filter_by(username= username).first()
  if user and bcrypt.check_password_hash(user.password, password):
    return user

def identity(payload):
  user_id = payload['identity']
  session = db.Session()
  return session.query(db.Operators).filter_by(idOperator= user_id)
jwt = JWT(app, authenticate, identity)

@jwt.jwt_payload_handler
def make_payload(identity):
    iat = datetime.utcnow()
    exp = iat + current_app.config.get('JWT_EXPIRATION_DELTA')
    nbf = iat + current_app.config.get('JWT_NOT_BEFORE_DELTA')
    identity = getattr(identity, 'idOperator') or identity['idOperator']
    return {'exp': exp, 'iat': iat, 'nbf': nbf, 'identity': identity}
但是我得到了一个错误,因为我的db表中没有id字段,因为我有一个idOperator

我怎样才能解决这个问题?_default_jwt_payload_handler(identity)函数用于查找Id字段,如何在不更改jwt的init.py的情况下将此自动Id字段更改为IdOperator


谢谢

您可以使用
jwt\u payload\u处理程序
装饰程序指定您自己的有效负载处理程序

例如,模拟默认行为,但使用
idOperator
可以如下所示:

def authenticate(username, password):
  session = db.Session()
  user = session.query(db.Operators).filter_by(username= username).first()
  if user and bcrypt.check_password_hash(user.password, password):
    return user

def identity(payload):
  user_id = payload['identity']
  session = db.Session()
  return session.query(db.Operators).filter_by(idOperator= user_id)
jwt = JWT(app, authenticate, identity)

@jwt.jwt_payload_handler
def make_payload(identity):
    iat = datetime.utcnow()
    exp = iat + current_app.config.get('JWT_EXPIRATION_DELTA')
    nbf = iat + current_app.config.get('JWT_NOT_BEFORE_DELTA')
    identity = getattr(identity, 'idOperator') or identity['idOperator']
    return {'exp': exp, 'iat': iat, 'nbf': nbf, 'identity': identity}
它使用:

from datetime import datetime
from flask import current_app

这是规范。

您可以使用
jwt\u payload\u处理程序
装饰程序指定您自己的有效负载处理程序

例如,模拟默认行为,但使用
idOperator
可以如下所示:

def authenticate(username, password):
  session = db.Session()
  user = session.query(db.Operators).filter_by(username= username).first()
  if user and bcrypt.check_password_hash(user.password, password):
    return user

def identity(payload):
  user_id = payload['identity']
  session = db.Session()
  return session.query(db.Operators).filter_by(idOperator= user_id)
jwt = JWT(app, authenticate, identity)

@jwt.jwt_payload_handler
def make_payload(identity):
    iat = datetime.utcnow()
    exp = iat + current_app.config.get('JWT_EXPIRATION_DELTA')
    nbf = iat + current_app.config.get('JWT_NOT_BEFORE_DELTA')
    identity = getattr(identity, 'idOperator') or identity['idOperator']
    return {'exp': exp, 'iat': iat, 'nbf': nbf, 'identity': identity}
它使用:

from datetime import datetime
from flask import current_app

这里是规范。

您可能需要考虑烧瓶JWT的扩展。烧瓶JWT已经废弃多年,而烧瓶JWT扩展仍然是积极维护和更容易定制:

< P>您可能需要考虑烧瓶JWT延长。Flask JWT已废弃多年,而Flask JWT extended仍在积极维护,更易于定制: