Как я могу защитить связь от Django до Flask микросервиса? - PullRequest
0 голосов
/ 26 февраля 2020

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

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

def myview(request):
    # Some code ... 
    req = requests.post('http://127.0.0.1:5000', json=myDataDict)

А вот как мой Flask сервис получает его:

@app.route("/", methods=["GET", "POST"])
def receivePost():
    data = request.get_json()
    # some code .. 
    return jsonify(data)

Опять же, эта система работает локально; я хочу сделать его более безопасным, когда я его разверну.

Вот мои проблемы:

1) Что если третья сторона прочитает, что находится внутри переменной myDataDict, когда две службы общаетесь? 2) Служба Flask должна принимать запросы ТОЛЬКО от службы Django.

Я провел некоторое исследование и обнаружил библиотеки, такие как OAuth2, и система проверки подлинности на основе токенов была бы хорошим способом сделать эту систему безопаснее, но я не знаю, как добавить его в мой настоящий код. Итак, вот мой вопрос: как я могу сделать эту систему безопасной? Любой совет приветствуется.

1 Ответ

1 голос
/ 26 февраля 2020

Вы можете использовать Flask-login для аутентификации пользователей, используя ключ API и адрес IP. Вот пример.

@login_manager.request_loader
def load_user_from_request(request):
    api_key = request.headers.get('My-Api-Key')
    is_api_path = re.match(r"^/api/+", request.path)
    if is_api_path and api_key:
        user = User.query.filter_by(key=api_key).first()
        if user and user.ip == request.remote_addr:
            return user

    return None

Использование Flask-login request_loader для загрузки и аутентификации пользователей без использования файлов cookie.

Сначала получите ключ API из заголовка HTTP, который называется My-Api-Key. Затем убедитесь, что запрос URL содержит /api/, чтобы сузить область, в которой вы можете аутентифицироваться с помощью API.

Если пользователь найден, проверьте, что запрос поступает от его IP.

Внутри Django приложения вы можете запросить FLASK приложение вроде этого.

resp = requests.post(url + "/api/myendpoint", json=data, headers={'Content-Type': 'application/json', 'My-Api-Key': api_key})

Наконец, не забудьте использовать HTTPS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...