Проблемы с созданием аутентификационного декоратора для Flask - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь настроить декоратор аутентификации для всей моей колбы app.routes.Каждый раз, когда вызывается функция, связанная с маршрутом, я проверяю, был ли передан правильный ключ с запросом.

Я создал декоратор (что, вероятно, неправильно) для этого.Сначала он сказал, что у него не было настроенного возвращаемого значения, которое я позже исправил.Когда я попытался запустить его снова, ошибка сказала:

"TypeError: unregisterApi () принимает 0 позиционных аргументов, но было дано 2 Функция представления не вернула правильный ответ. Тип возвращаемого значения должен бытьстрока, кортеж, экземпляр Response или вызываемый WSGI, но это была функция. ".

Я уверен, что проблема в моем декораторе, но я не знаю, как это исправить.

Вот код для декоратора и декорированной функции:

Декоратор:

def requestAuth(func):
   def funcWrapper():
       data = request.get_json(force=True)
       apiAddr = request.remote_addr
       apiKey = data["API Register Key"]

       conn = sqlite3.connect("database/controllerConfiguration.db")
       cursor = conn.cursor()
       cursor.execute('select apikey from SystemAPI where apihost  = \"{0}\";'.format(apiAddr))
       result = cursor.fetchall()
       if result[0][0] != apiKey:
           return "ERROR - Authentication with the controller failed",400
       elif result[0][0] == apiKey:
           return func
   return funcWrapper

Маршрут связанной функции, которую он декорирует:

@app.route('/unregister',methods=['POST'])
@requestAuth
def unregisterApi():
   data = request.get_json(force=True)
   apiKey = data["API Register Key"]
   apiAddr = request.remote_addr

   conn = sqlite3.connect('database/controllerConfiguration.db')
   cursor = conn.cursor()
   cursor.execute('delete from SystemAPI where apikey = \"{}\";'.format(apiKey))
   conn.commit()
   conn.close()

   return jsonify({"Response":"Success"})

Чтоя надеялся добиться:

Каждый раз, когда вызывается функция маршрута (/unregister,/register,...), декоратор @requestAuth проверяет, был ли передан правильный ключ, если он возобновит работу функции маршрута и выполнитесли ключ не совпадает, он просто возвращает строку ошибки с кодом состояния (string: "ERROR - Authentication with the controller failed", Status code: 400).

1 Ответ

0 голосов
/ 08 февраля 2019

Проблема с оператором elif в funcWrapper:

elif result[0][0] == apiKey:
   return func

func - это вызываемый объект, т.е. исходная функция, заключенная в requestAuth, которая в данном случаеunregisterApi.Вместо этого вызовите func, чтобы вернуть действительный тип, а не сам экземпляр объекта:

elif result[0][0] == apiKey:
   return func()

Также имейте в виду, что если оба оператора if и elif завершатся неудачно, None будетбудет возвращено funcWrapper, снова поднимая исходную ошибку.Таким образом, вы можете захотеть пересмотреть, как вы хотите обрабатывать этот конкретный случай.

...