首页 > 解决方案 > 如何保护从 Django 到 Flask 微服务的通信?

问题描述

我设计了一个简单的 Django 服务,它使用 POST 请求与 Flask 微服务进行通信。基本上,用户提交一个带有一些首选项的表单,这些首选项被发送到 Django 视图,Django 视图将这些发送到 Flask,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 等库进行了一些研究并发现,令牌身份验证系统将是使该系统更安全的好方法,但我真的不知道如何将其添加到我的实际代码中。所以这是我的问题:我怎样才能使这个系统安全?任何形式的建议表示赞赏。

标签: pythondjangoflask

解决方案


您可以使用密钥和地址Flask-login对用户进行身份验证。这是一个例子。APIIP

@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'srequest_loader加载和验证用户而不使用 cookie。

首先从这里调用的标题中获取API密钥。然后检查请求是否包含以缩小您可以使用.HTTPMy-Api-KeyURL/api/API

如果找到用户,请检查请求是否来自他们的IP.

在您的Django应用程序中,您可以像这样请求FLASK应用程序。

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

最后别忘了使用HTTPS


推荐阅读