使用dotenv能否将JSON文件存储到ENV变量中?

36

我正在使用谷歌云端硬盘API与我的Rails应用程序。API运作良好。我有以下的client_secret.json文件:

{
  "type": "service_account",
  "project_id": "gobirdie-landing-page",
  "private_key_id": "xxxxx",
  "private_key": "-----BEGIN PRIVATE KEY----- xxxxx -----END PRIVATE KEY-----\n",
  "client_email": "xxxxxxx@gobirdie-landing-page.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxx",
  "auth_uri": "xxxxxx",
  "token_uri": "xxxxxxx": "xxxxxxxx": "xxxxxxxxx"
}

它在我的控制器中被称为

@session = GoogleDrive::Session.from_service_account_key("client_secret.json")

使用此配置没有问题,我成功地使用了API。但是,我想像这样将我的JSON存储在.env文件中:


CLIENT_SECRET = "{
  "type": "service_account",
  "project_id": "gobirdie-landing-page",
  "private_key_id": "xxxxx",
  "private_key": "-----BEGIN PRIVATE KEY----- xxxxx -----END PRIVATE KEY-----\n",
  "client_email": "xxxxxxx@gobirdie-landing-page.iam.gserviceaccount.com",
  "client_id": "xxxxxxxxx",
  "auth_uri": "xxxxxx",
  "token_uri": "xxxxxxx": "xxxxxxxx": "xxxxxxxxx"
}" 

然后在控制器中以这种方式调用它

@session = GoogleDrive::Session.from_service_account_key(ENV['CLIENT_SECRET'])

或者这样做

@session = GoogleDrive::Session.from_service_account_key(JSON.parse(ENV['CLIENT_SECRET']))

但是这两种方法都不起作用。所以我的问题是:"是否可能将JSON文件存储在ENV变量中?"

6个回答

19

将JSON对象转换为字符串并存储在ENV中

您可以使用JSON.dump将JSON对象转换为字符串

然后在您的控制器中使用JSON.parse(ENV ['CLIENT_SECRET'])

或者

您可以在initializers文件夹中创建一个名为google_session.rb的文件

$google_session = GoogleDrive::Session.from_service_account_key(
   # config goes here
)

在您的控制器中,您将可以访问全局变量$google_session


8
您可以将该项放在一行上,例如:
VITE_FIREBASE={"apiKey":"slslsls","slsls":"lelsls"}

您只需要确保您的键名有引号

并像下面这样获取它们(SvelteKit示例):

const p = process?.env ? process.env : import.meta.env;

const firebase_config = JSON.parse(p.VITE_FIREBASE);

J


2
是的,可以将JSON文件存储在变量中。 不过需要进行一个小修改:

是的,可以将JSON文件存储在变量中。 不过需要进行一个小修改:

\\\"type\\\": \\\"service_account\\\",

将json中花括号内的每个双引号都这样处理。最初的回答保留html标签,不作解释。

谢谢您的回答,但问题仍然存在,如下面我的回答所进一步解释的那样。 - Quentin P.
没错,我已经删除了所有的空格,但问题仍然存在。 - Quentin P.
9
比如在NodeJs中,你可以将JSON作为环境变量值简单地包含进去,如 SURVEY_OBJ={"IncludeSurveys" : ["abc","wxy","z"]} ,然后通过使用 let myObj = JSON.parse(process.env.SURVEY_OBJ) 来解析该环境变量。 echo myObj.IncludeSurveys[1] 应该输出wxy。因此,无需转义引号或删除空格。 - w. Patrick Gale
2
@w.PatrickGale,我认为你的评论应该成为答案。 - Igor Soloydenko
@w.PatrickGale 提供了最佳解决方案。Rails环境变量唯一的限制是JSON对象必须全部在一行上,而不能作为多行JSON简单地粘贴进去。 - Jamie Buchanan
显示剩余2条评论

1
你需要对你的JSON进行压缩,并将所有的\n替换为\\n
CLIENT_SECRET={"type":"service_account","project_id":"gobirdie-landing-page","private_key_id":"xxxxx","private_key":"-----BEGIN PRIVATE KEY-----\\nxxxxx\\n-----END PRIVATE KEY-----\\n","client_email":"xxxxxxx@gobirdie-landing-page.iam.gserviceaccount.com","client_id":"xxxxxxxxx","auth_uri":"xxxxxx","token_uri":"xxxxxxx","xxxxxxxx":"xxxxxxxxx"}

1
我想到的解决方案是对JSON对象进行基础编码并存储,然后在使用时进行解码。

我个人也这样做,这样避免了将字符转义为 env 变量字符串的麻烦。然而,在转换成 base64 之前,我会先进行缩小代码以节省一些字符。 - James White

0
如果您将帐户密钥存储为Rails凭据或DOT ENV中的哈希值,则可以这样做。
google_drive:
  account_key:
    type: service_account,
    project_id: gobirdie-landing-page,
    client_email: ...,
    client_id: ...,
    private_key: "-----BEGIN PRIVATE KEY-----...\n-----END PRIVATE KEY-----\n",
    auth_uri: https://accounts.google.com/o/oauth2/auth,
    token_uri: https://oauth2.googleapis.com/token,
    auth_provider_x509_cert_url: https://www.googleapis.com/oauth2/v1/certs,
    client_x509_cert_url: ...,
    universe_domain: googleapis.com,


你可以这样做来生成一个会话:

session = GoogleDrive::Session.from_service_account_key(
  StringIO.new(JSON.generate(
    # or ENV['google_drive']['account_key']
    Rails.application.credentials.google_drive.account_key
  ))
) 

spreadsheet = session.spreadsheet_by_title("My Spreadsheet")
worksheet = spreadsheet.worksheets.first


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接