简体   繁体   English

我们如何将 JSON 凭证存储到 python 中的 ENV 变量?

[英]How can we store a JSON credential to ENV variable in python?

{
    "type": "service_account",
    "project_id": "project_id",
    "private_key_id": "private_key_id",
    "private_key": "-----BEGIN PRIVATE KEY-----\n",
    "client_email": "email",
    "client_id": "id",
    "auth_uri": "uri_auth",
    "token_uri": "token_urin",
    "auth_provider_x509_cert_url": "auth_provider_x509_cert_url",
    "client_x509_cert_url": "client_x509_cert_url"
}

I tried encoding and decoding the JSON but it didn't work我尝试对 JSON 进行编码和解码,但没有成功

I even tried using /// in place of " "我什至尝试使用 /// 代替“”

So I am using sheets-api.所以我正在使用 sheets-api。 What I want to achieve is loading the path-for-json-file from.env variable我想要实现的是从 .env 变量加载 path-for-json-file

scope=['https://spreadsheets.google.com/feeds',
      'https://www.googleapis.com/auth/drive',
      'https://www.googleapis.com/auth/drive.file',
      'https://www.googleapis.com/auth/spreadsheets'
      ]
credentials = ServiceAccountCredentials.from_json_keyfile_name(r"path-for-json-file", scope)
client = gspread.authorize(credentials)

Assuming your JSON file is creds.json假设你的 JSON 文件是creds.json

creds.json学分.json

{
    "type": "service_account",
    "project_id": "project_id",
    "private_key_id": "private_key_id",
    "private_key": "-----BEGIN PRIVATE KEY-----\n",
    "client_email": "email",
    "client_id": "id",
    "auth_uri": "uri_auth",
    "token_uri": "token_urin",
    "auth_provider_x509_cert_url": "auth_provider_x509_cert_url",
    "client_x509_cert_url": "client_x509_cert_url"
}

main.py主程序

import json

data = json.load(open('creds.json'))

f = open(".env", "x")

for key, value in data.items():
    f.write(f"{key.upper()}={value}\n")

creds.env will be generated将生成 creds.env

TYPE=service_account
PROJECT_ID=project_id
PRIVATE_KEY_ID=private_key_id
PRIVATE_KEY=-----BEGIN PRIVATE KEY-----

CLIENT_EMAIL=email
CLIENT_ID=id
AUTH_URI=uri_auth
TOKEN_URI=token_urin
AUTH_PROVIDER_X509_CERT_URL=auth_provider_x509_cert_url
CLIENT_X509_CERT_URL=client_x509_cert_url

create_keyfile_dict() basically returns a dict called variable_keys create_keyfile_dict()基本上返回一个名为variable_keys的字典

from dotenv import load_dotenv

load_dotenv()

def create_keyfile_dict():
    variables_keys = {
        "type": os.getenv("TYPE"),
        "project_id": os.getenv("PROJECT_ID"),
        "private_key_id": os.getenv("PRIVATE_KEY_ID"),
        "private_key": os.getenv("PRIVATE_KEY"),
        "client_email": os.getenv("CLIENT_EMAIL"),
        "client_id": os.getenv("CLIENT_ID"),
        "auth_uri": os.getenv("AUTH_URI"),
        "token_uri": os.getenv("TOKEN_URI"),
        "auth_provider_x509_cert_url": os.getenv("AUTH_PROVIDER_X509_CERT_URL"),
        "client_x509_cert_url": os.getenv("CLIENT_X509_CERT_URL")
    }
    return variables_keys

scope=['https://spreadsheets.google.com/feeds',
      'https://www.googleapis.com/auth/drive',
      'https://www.googleapis.com/auth/drive.file',
      'https://www.googleapis.com/auth/spreadsheets'
      ]
credentials = ServiceAccountCredentials.from_json_keyfile_name(create_keyfile_dict(), scope)
client = gspread.authorize(credentials)

A simpler way using a single env variable使用单个env变量的更简单方法

  • First encode your JSON in base-64 as follows:首先将您的 JSON 编码为 base-64,如下所示:
import json
import base64
import os
from dotenv import load_dotenv, find_dotenv


service_key = {
    "type": "service_account",
    "project_id": "project_id",
    "private_key_id": "private_key_id",
    "private_key": "-----BEGIN PRIVATE KEY-----\n",
    "client_email": "email",
    "client_id": "id",
    "auth_uri": "uri_auth",
    "token_uri": "token_urin",
    "auth_provider_x509_cert_url": "auth_provider_x509_cert_url",
    "client_x509_cert_url": "client_x509_cert_url"
}

# convert json to a string
service_key = json.dumps(service_key)

# encode service key
encoded_service_key = base64.b64encode(service_key.encode('utf-8'))

print(encoded_service_key)
# b'many_characters_here'
  • In your .env file, add an environment variable SERVICE_ACCOUNT_KEY with the value of encoded_service_key :在您的.env文件中,添加一个值为encoded_service_key的环境变量SERVICE_ACCOUNT_KEY
SERVICE_ACCOUNT_KEY = b'a_long_string'
  • Now to convert the encoded string back to JSON:现在将编码后的字符串转换回 JSON:
# get the value of `SERVICE_ACCOUNT_KEY`environment variable
load_dotenv(find_dotenv())
encoded_key = os.getenv("SERVICE_ACCOUNT_KEY")

# remove the first two chars and the last char in the key
encoded_key = str(encoded_key)[2:-1]

# decode
original_service_key= json.loads(base64.b64decode(encoded_key).decode('utf-8'))

print(original_service_key['private_key_id'])
# private_key_id

# credentials = ServiceAccountCredentials.from_json_keyfile_name(
#     original_service_key, scope)
# client = gspread.authorize(credentials)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将管道凭证参数作为环境变量传递给 python 脚本 - How to pass pipeline credential parameter to python script as env variable 我们如何将某个变量的先前值存储在 python 中的某个其他变量中? - How can we store previous value of some variable in some other variable in python? 我们应该如何创建凭证以通过Python连接到Google Analytics(分析)? - How we should create the credential to connect to google analytics via Python? 我们如何使用 python 在单个数组中存储两个不同的参数? - How can we store two different parameters in a single array with python? Python:如何在windows中的env变量中处理unicode - Python: How to handle unicode in env variable in windows 如何使用python脚本设置Jenkins env变量 - how to set Jenkins env variable with python script 如何根据Python中的特定条件将json的特定部分存储在变量中? - How to store a particular portion of json in a variable based on certain condition in Python? 如何在python中存储变量? - How to store a variable in python? 我们如何在 Python 中将接收到的数据转换为 JSON 格式 - How can we convert the data received into JSON format in Python 我们如何使用 python 更新 json 文件中的父标题? - How can we update parent header in json file using python?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM