Elixir Phoenix设置和使用环境变量

时间:2017-06-13 04:42:31

标签: oauth elixir phoenix-framework ueberauth

我有一个凤凰应用程序正在对github进行OAuth调用。我想将我的密钥存储为环境变量,因此我可以将它们保留在版本控制之外。

我创建了一个名为.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时,我几乎可以发出请求,我从github看到了404页面。我注意到网址没有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

我得到的是没有value https://github.com/login/oauth/authorize的网址? client_id = & redirect_uri = http%3A%2F%2Flocalhost%3A4000%2Fauth%2Fgithub%2Fcallback& ; RESPONSE_TYPE =代码&安培;范围=用户%2Cpublic_repo`

如果我不在config.exs中使用环境变量而是使用字符串值,则请求可以正常工作。

如何在凤凰城使用环境变量?

4 个答案:

答案 0 :(得分:3)

如果使用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环境变量集生成发布。

Distillery Docs

答案 1 :(得分:2)

您不应该使用双引号包装client_id字符串。按原样写下:

export GITHUB_CLIENT_ID=891538_my_key_bf0055

在启动服务器或IEx之前,请不要忘记source .env

答案 2 :(得分:1)

如果您希望ENV变量仅在应用程序的过程中保持可见,您可以将它们放在 .env 文件中并使用

执行您的应用程序

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

当然,在生产中你可能想尝试一些更复杂的机制,但上面的工作对于简单的/ dev用例是正常的,它会让你知道你的应用程序是否正确读取了ENV var。

答案 3 :(得分:0)

对于开发 - 按iex -S mix phx.server运行时 - 您可以在.iex.exs中设置变量:

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