Настройка Elixir Phoenix и использование переменных окружения

У меня есть приложение Phoenix, которое выполняет вызов OAuth в github. Я хочу хранить свои секретные ключи как переменные среды, чтобы не допустить их контроля версий.

Я создал файл с именем .env, в котором я определяю свой закрытый ключ:

export GITHUB_CLIENT_ID="891538_my_key_bf0055"

Я пытаюсь получить свой закрытый ключ в моем config.exs файле, который отвечает за настройку вашего приложения с помощью System.Config.

config :ueberauth, Ueberauth.Strategy.Github.OAuth, client_id: System.get_env("GITHUB_CLIENT_ID"), client_secret: System.get_env("GITHUB_SECRET_ID")

Короче говоря, мой контроллер почти может рукопожатие с github для запроса. Когда я делаю запрос в github для авторизации моего приложения http://localhost:4000/auth/github, я почти могу сделать запрос и вижу страницу 404 из github. Я заметил, что в URL-адресе нет client_id!

Мой маршрутизатор для доступа к обратному вызову

  scope "/auth", Discuss do
    pipe_through :browser # Use the default browser stack

    # make request to github, google, fb
    get "/:provider", AuthController, :request
    get "/:provider/callback", AuthController, :callback
  end

И я получаю URL без value https://github.com/login/oauth/authorize? client_id = & redirect_uri = http% 3A% 2F% 2Flocalhost% 3A4000% 2Fauth% 2Fgithub% 2Fcallback & response_type = code & scope = user% 2Cpublic_repo`

Если я не использую переменную среды в config.exs, а вместо этого использую строковое значение, запрос работает должным образом.

Как использовать переменные среды в Phoenix?


person Alex Fallenstedt    schedule 13.06.2017    source источник


Ответы (4)


При использовании выпусков Distillery вы можете избежать использования System.get_env/1 внутри файлов config.exs, поскольку он будет хранить значение переменной среды во время сборки, а не во время выполнения.

В конфигурации prod.exs вы можете использовать

config :ueberauth, Ueberauth.Strategy.Github.OAuth,
    client_id: "${GITHUB_CLIENT_ID}",
    client_secret: "${GITHUB_SECRET_ID}"

Затем сгенерируйте выпуск с установленной переменной среды REPLACE_OS_VARS=true.

Документы ликеро-водочного завода

person Mike Buhot    schedule 13.06.2017
comment
Сегодня вечером я проверю документацию Distillery и посмотрю, как я могу реализовать это в своем проекте. Если все пойдет хорошо, я отмечу это как правильный ответ. Спасибо, Майк! - person Alex Fallenstedt; 13.06.2017

Строку client_id не следует заключать в двойные кавычки. Напишите как есть:

export GITHUB_CLIENT_ID=891538_my_key_bf0055

Перед запуском вашего сервера или IEx не забудьте source .env.

person BachirC    schedule 14.06.2017

Если вы хотите, чтобы ваши переменные ENV оставались видимыми только в процессе работы вашего приложения, вы можете поместить их в файл .env и запустить приложение с помощью

env $(cat .env | grep -v ^# | xargs) iex -S mix phoenix.server

Конечно, в процессе производства вы можете захотеть попробовать более сложный механизм, но вышеперечисленное работает нормально для простого варианта использования / dev и сообщит вам, правильно ли ваше приложение считывает переменную ENV.

person hisa_py    schedule 14.06.2017
comment
К этому же и привели меня мои исследования. Я обнаружил, что в производственной среде лучше всего хранить эти переменные в prod.secret.exs. Если бы я должен был хранить свои ключи в этом файле, как я могу получить к ним доступ? В настоящее время я получаю свои ключи для разработки именно так. github.com/Fallenstedt/elixir-discuss/ blob / master / config / - person Alex Fallenstedt; 14.06.2017

Для разработки - при запуске iex -S mix phx.server - вы можете установить переменные в .iex.exs:

System.put_env(%{"GITHUB_CLIENT_ID" => "891538_my_key_bf0055",
                 "GITHUB_SECRET_ID" => "1234567890asdfghjkls"})
person TNT    schedule 15.09.2017