【问题标题】:where to store api key in Django在 Django 中存储 api 密钥的位置
【发布时间】:2022-01-21 12:52:14
【问题描述】:

我目前通过 Mongolabs 构建使用外部 MongoDb 的 Web 应用程序。 该 api 基于在 url 中使用的个人密钥。正如文档所说,例如:

以下是完整资源 URL 的示例:

https://api.mongolab.com/api/1/databases?apiKey=**2E81PUmPFI84t7UIc_5YdldAp1ruUPKye** 所以问题是如何安全地存储这样的 api 密钥 2E81PUmPFI84t7UIc_5YdldAp1ruUPKye

阅读有关跨站点请求伪造的 Django 文档,但仍然不明白密钥记录在哪里。

【问题讨论】:

  • 只需将其保存在 settings.py 中即可,无需提供任何额外的安全性。如果有人能读懂你的源代码,那你就麻烦大了。

标签: ajax django mongodb mlab


【解决方案1】:

有两种方法可以做到这一点。

一种方法是在主settings.py 文件中导入一个local_settings.py 文件并放入.gitignore,这样它就不会在git 中。然而,有些人认为这不是一个好的做法,因为它可能会试图将 VCS 中没有的复杂东西放在那里,所以人们实际上有不同的环境。不过我觉得很好。

try:
    from local_settings import *
except ImportError:
    pass  # No local_settings file

另一种方式(不喜欢第一种方式的人推荐)是通过环境变量设置它,并在settings.py中读取这些。

MONGO_API_KEY = os.environ['MONGO_API_KEY']

然后你必须以某种方式传递环境变量。例如。通过 uwsgi 的 environ 设置,或者通过导出在你的 bash 中设置它,或者通过其他方式。

【讨论】:

    【解决方案2】:

    我会从环境变量将它加载到设置文件中。看看Django Settings

    【讨论】:

    • 这些 API 密钥通常是保密的,因此如果您的项目是开源的,将其放在代码库中的某个位置并不理想。
    • 这就是我从环境变量加载它的原因。我从来没有说过将它们作为字符串写入 settings.py。
    • 嗯,好的。有道理
    【解决方案3】:

    另一种方法是使用库django-fernet-fields,它使用库cryptography

    用法很简单。在您的模型中,您需要添加一个新字段:

    from django.db import models
    from fernet_fields import EncryptedTextField
    
    class MyModel(models.Model):
        apikey = EncryptedTextField()
    

    默认情况下,该字段将使用您设置中的SECRET_KEY 进行加密。因此,如果您更改或丢失它,您将无法访问您的数据。

    为了更好的安全性,您可以将SECRET_KEY 保存为环境变量,然后将其传递给设置文件。

    import os
    
    SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')
    

    django-fernet-fields

    【讨论】:

      【解决方案4】:

      快速回答:

      1. 存储在 .env 中
      2. 读入settings.py

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 2017-10-22
        • 2023-02-10
        • 2017-04-10
        • 2010-11-09
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多