Я нахожусь в процессе написания инструмента на 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:
Сохраните пароль пользователя в сеансе Flask, чтобы модуль «запросов» мог сгенерировать заголовок базовой авторизации для олицетворения пользователя при вызове API. (Но я подозреваю, что это плохая идея.)
Создайте привилегированную учетную запись (с собственным паролем) для веб-приложения. Попросите веб-приложение использовать эту учетную запись для вызова модуля «запросов» и передать значение «владельца», которое является идентификатором пользователя фактического пользователя. (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?