Передача аутентификации Flask-Login из веб-приложения в API

Я нахожусь в процессе написания инструмента на Flask, который имеет как прямой интерфейс API, так и веб-интерфейс, который использует API под капотом. Так, например, чтобы создать новую группу с помощью инструмента, вы можете сделать это одним из двух способов:

Метод API

  • POST объект JSON в http://example.net/api/addgroup со всеми параметрами для создания группа. (Аутентификация проходит через базовую авторизацию HTTP. Flask-Login аутентифицирует пользователя из локальной базы данных пользователей)
  • Предполагая, что пользователь авторизован, API создает группу, устанавливает «владельцем» вошедшего в систему пользователя и возвращает JSON с информацией об успехе / неудаче.

Веб-метод. Перейдите на страницу http://example.net/addgroup.

  • Войдите в систему (снова Flask-Login аутентифицирует пользователя из локальной базы данных пользователей)

  • Заполните форму

  • Нажмите "Отправить".

  • Веб-приложение вызывает внутреннее приложение API, анализирует возвращаемый им JSON и показывает пользователю сообщение об успешном / неудачном завершении.

Теперь сложная часть выделена жирным шрифтом там, где веб-интерфейс вызывает интерфейс API на бэкэнде (используя модуль «запросы» Python). По умолчанию в API не передается аутентификация. Но это не сработает - API нужна информация аутентификации для авторизации и для назначения «владельца» при создании группы.

Я могу придумать несколько способов для веб-приложения передать аутентификацию в API:

  1. Сохраните пароль пользователя в сеансе Flask, чтобы модуль «запросов» мог сгенерировать заголовок базовой авторизации для олицетворения пользователя при вызове API. (Но я подозреваю, что это плохая идея.)

  2. Создайте привилегированную учетную запись (с собственным паролем) для веб-приложения. Попросите веб-приложение использовать эту учетную запись для вызова модуля «запросов» и передать значение «владельца», которое является идентификатором пользователя фактического пользователя. (API будет настроен так, чтобы разрешить «владельцу» проходить только через эту привилегированную учетную запись. Все другие виды использования API будут принимать владельца из текущего пользователя, вошедшего в систему).

Уместно (и безопасно!) Использовать любой из этих методов? Или есть другой способ полностью передать аутентификацию в API веб-приложением?

ОБНОВЛЕНИЕ 11 июля 2016 г.

Как упоминается в комментариях ниже, я не против прямого вызова классов API в приложении, тем самым вообще избегая необходимости делать HTTP-запрос. Но я не знаю, как это сделать с помощью Flask-Restful. , который реализует GET и POST следующим образом:

class MakeList(Resource):

    def get(self, group_id=None):
        # Do GET stuff here

    def post(self, group_id):
        # Do POST stuff here

api.add_resource(MakeList, '/api/makelist', '/api/makelist/<int:group_id>', \
                 endpoint='api-makelist')

Как мне вызвать метод get или post из другого места в приложении Flask?


person David White    schedule 08.07.2016    source источник
comment
Я бы предложил раскрыть функции api через служебные классы, которые могут быть вызваны веб-приложением, а не модулем запросов.   -  person Sugam    schedule 08.07.2016
comment
@Sugam, спасибо за ваши мысли. Я использую Flask-Restful, который определяет класс ресурсов (например, AddGroup), а затем определяет методы получения и публикации внутри класса (которые автоматически вызываются в операциях GET и POST). Как я могу напрямую получить доступ к операциям AddGroup get и AddGroup post через веб-приложение?   -  person David White    schedule 09.07.2016


Ответы (1)


Что я бы сделал - и я считаю, что предлагал @Sugam, - это создать библиотеку Python, содержащую бизнес-логику. Извлеките код BL из веб-API в эту библиотеку, затем вызовите библиотеку из веб-API. Таким образом, проект api является просто фасадом, обеспечивающим RESTful-доступ к методам в библиотеке.

Это позволит вам раскрыть бизнес-логику через другие формы пользовательского интерфейса, такие как CLI (консоль), библиотечный API (если вы хотите использовать его в другом приложении), мобильные приложения, Интернет и т. Д. Это, естественно, позволяет вам вызывать та же библиотека Python с вашего веб-сайта, полностью избегая каких-либо сетевых вызовов через проект веб-API.

Более того, вы сможете писать тесты, которые четко демонстрируют использование и подтверждают, что он выполняет то, что должен делать, избегая при этом ненужных деталей, таких как протоколы, форматы и т. Д.

Надеюсь, это объяснение достаточно ясное.

person Alen Siljak    schedule 27.12.2018