Я написал небольшой API-интерфейс falsk-restpluss с двумя конечными точками: / login и /users.
Он имеет аутентификацию jwt, и эта часть работает нормально.
Декоратор, которыйпроверка токена также приводит к получению текущего пользовательского объекта из базы данных и отправке его обратно в функцию get.
мне кажется, что декоратор не возвращает объект функции get, и я могу 't выяснить, почему.
Любая помощь очень ценится!
Я получаю эту ошибку:
if not current_user.admin:
AttributeError: 'Users' object has no attribute 'admin'
Я использую flask-restplus и python 3.7
Это мой код:
import ....
(Import left out)
app = Flask(__name__)
app.config.SWAGGER_UI_DOC_EXPANSION = 'full'
authorizations = {
'apikey' : {
'type' : 'apiKey',
'in' : 'header',
'name' : 'X-API-KEY'
}
}
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
....
(Rest of the definitions is left out.)
def token_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = None
if 'X-API-KEY' in request.headers:
token = request.headers['X-API-KEY']
if not token:
return {'message' : 'Token is missing!'}, 401
try:
data = jwt.decode(token, app.config['SECRET_KEY'])
current_user = User.query.filter_by(public_id=data['public_id']).first()
except:
return {'message' : 'Token is invalid!'}, 401
return f(current_user, *args, **kwargs)
return decorated
@api.route('/user')
class Users(Resource):
@token_required
@api.doc(security='apikey')
def get(self,current_user):
if not current_user.admin:
return {'message' : 'Cannot perform that function!'}
return {'users' : 'List of users to come.'}
@api.route('/login')
class Login(Resource):
def get(self):
auth = request.authorization
if not auth or not auth.username or not auth.password:
return make_response('No user credits are entered', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})
user = User.query.filter_by(name=auth.username).first()
if not user:
return make_response('user is empty', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})
token = jwt.encode({'public_id' : user.public_id, 'exp' : datetime.now() + timedelta(minutes=30)}, app.config['SECRET_KEY'])
if check_password_hash(user.password, auth.password):
token = jwt.encode({'public_id' : user.public_id, 'exp' : datetime.now() + timedelta(minutes=30)}, app.config['SECRET_KEY'])
return {'token' : token.decode('UTF-8')}
return make_response('User not hashed', 401, {'WWW-Authenticate' : 'Basic realm="Login required!"'})