python - 在 Django 项目中哪里安全地存储 Google_Application_Credentials?

标签 python django docker google-cloud-platform docker-compose

我有一个使用 Google API 的 Django 项目。我创建了一个 docker-compose.yml,其中包含 Django 容器和 Nginx 容器。它构建成功,但是当我运行 docker-compose up 时,出现以下错误:

google.auth.exceptions.DefaultCredentialsError:找不到文件/file/path/credentials.json。

我已经安装了 Google SDK 并运行了“gcloud auth application-default login”,这会在我的根目录中创建 json 文件。然后我为其创建了一个环境变量并配置了我的 Django 应用程序。

设置.py:

GOOGLE_APPLICATION_CREDENTIALS = os.environ["GOOGLE_APPLICATION_CREDENTIALS"]

我可以在查找器中打开凭证 json 文件,这样我就知道它在那里。

secret 管理器正在使用 Google API 来检索 secret key :

from google.cloud import secretmanager
import environ

env = environ.Env()
environ.Env.read_env()


def get_secret(secret_id, version_id="latest"):
    project_id = env("GOOGLE_PROJECT_ID")
    client = secretmanager.SecretManagerServiceClient()
    name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
    response = client.access_secret_version(name=name)
    return response.payload.data.decode("UTF-8")

在不运行 docker-compose up 的情况下,它可以正常工作,我可以检索 key ,但我想在运行我的 docker 容器时对其进行测试。

我的 docker-compose.yml:

version: '3'

services:
  backend:
    build:
      context: ./
      dockerfile: ./Dockerfile
    env_file:
      - ./backend/.env
    container_name: backend
    ports:
      - 8000:8000
  nginx:
    build:
      context: ./nginx
      dockerfile: ./Dockerfile
    container_name: nginx
    ports:
      - 80:80
    depends_on:
      - backend

我什至尝试下载服务帐户 key ,将其放在我的下载文件夹中

当我将文件移动到 django 项目中时,它可以准备好它,但根据我的理解,源代码中不应该有凭据文件。那么我应该在哪里存储凭据才能安全地工作?

最佳答案

这里缺少两个步骤来使用容器中的本地服务帐户,而不实际将其存储在那里或将其添加到您的 git 存储库:

我会笼统地说一下,然后您可以将它们添加到您的 docker-compose.yml 中:

Google 服务应该在哪里查看

环境变量 GOOGLE_APPLICATION_CREDENTIALS 告诉 Google 服务应在容器中的何处查找服务帐户。因此,在您的服务中,设置一个带有绝对路径的环境变量在容器中这些 Google 服务应该在其中查找:

services:
  backend:
    build:
      context: ./
      dockerfile: ./Dockerfile
    environment:
      GOOGLE_APPLICATION_CREDENTIALS: /tmp/keys/application_default_credentials.json
    env_file:
      - ./backend/.env

从本地计算机映射

因为您不想将服务帐户存储在存储库中,所以需要在 docker-compose.yml 中设置一个映射上述内容的 volume GOOGLE_APPLICATION_CREDENTIALS 添加到本地计算机上的服务帐户。如果您的服务帐户位于 /jdez/Downloads/service-account.json,您将按如下方式设置卷:

services:
  backend:
    build:
      context: ./
      dockerfile: ./Dockerfile
    environment:
      GOOGLE_APPLICATION_CREDENTIALS: /tmp/keys/application_default_credentials.json
    env_file:
      - ./backend/.env
    volumes:
      - /jdez/Downloads/service-account.json:/tmp/keys/application_default_credentials.json

现在,当 Google 服务在 GOOGLE_APPLICATION_CREDENTIALS 查找该文件时,它们会读取您的Downloads 目录中的文件。

由于您使用的是服务帐户,因此您甚至不需要运行 gcloud,除非您需要它用于其他用途。

关于python - 在 Django 项目中哪里安全地存储 Google_Application_Credentials?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75645717/

相关文章:

Django序列化器错误: 'NoneType' object has no attribute '_meta'

ubuntu - 系统错误: exec format error when I start a docker container

php - 在PHP Web应用程序中无法访问Docker环境变量

docker - 如何在本地访问 nginx 入口?

javascript - 有没有人有使用 Backbone.js 和 Pylons/Pyramid 的经验?有什么 sample 要看吗?

python - 谜语: The Square Puzzle

django - 如何更改django-rest-framework的authtoken中的现有 token ?

带有 postgis 的 Django2 给出了不可排序的类型 : F() < int()

python - PyUSB 与 Windows、libusb1 和 libusb-win32 后端不工作

python - 如何动态地将属性添加到类中?