Можно ли сохранить файл JSON в переменную ENV с помощью dotenv? - PullRequest
0 голосов
/ 23 мая 2019

Я использую Google Drive 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?»

Ответы [ 3 ]

0 голосов
/ 23 мая 2019

Я попытался внести изменения, как вы предлагаете. Мой файл .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\ \ \": \ \ \"xxxx@gobirdie-landing-page.iam.gserviceaccount.com\ \ \",
  \ \ \"client_id\ \ \": \ \ \"xxxx\ \ \",
  \ \ \"auth_uri\ \ \": \ \ \"https://accounts.google.com/o/oauth2/auth\ \ \",
  \ \ \"token_uri\ \ \": \ \ \"xxxxx\ \ \",
  \ \ \"auth_provider_x509_cert_url\ \ \": \ \ \"xxxx\ \ \",
  \ \ \"client_x509_cert_url\ \ \": \ \ \"https://www.googleapis.com/robot/v1/metadata/x509/landingpageserviceaccount2%40gobirdie-landing-page.iam.gserviceaccount.com\ \ \"
}

Однако, когда я загружаю страницу на localhost: 3000, я все равно получаю ту же ошибку, что и раньше.

File name too long @ rb_sysopen - { "type": "service_account", ....... }
0 голосов
/ 24 мая 2019

Преобразование объекта JSON в строку и сохранение его в ENV

. Вы можете использовать JSON.dump для преобразования объекта JSON в строку

, а затем в своем контроллере JSON.parse(ENV['CLIENT_SECRET'])

В качестве альтернативы

вы можете создать google_session.rb внутри initializers папки

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

, и в вашем контроллере у вас будет доступ к $google_session globalпеременная

0 голосов
/ 23 мая 2019

Да. Можно сохранить файл JSON в переменной. Однако требуется одно небольшое изменение:

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

Сделайте это для каждой двойной кавычки внутри фигурных скобок json.

...