2

我有一个凤凰应用程序正在对 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的 URL ?client_id= &redirect_uri=http%3A%2F%2Flocalhost%3A4000%2Fauth%2Fgithub%2Fcallback&response_type=code&scope=user%2Cpublic_repo`

如果我不使用环境变量config.exs,而是使用字符串 value,则请求会正常工作。

如何在 Phoenix 中使用环境变量?

4

4 回答 4

3

如果使用 Distillery 版本,您可能希望避免System.get_env/1config.exs文件内部使用,因为它将在构建时存储环境变量的值,而不是运行时。

prod.exs配置中,您可以使用

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

然后生成带有REPLACE_OS_VARS=true环境变量集的版本。

酒厂文件

于 2017-06-13T05:28:02.750 回答
2

您不应该client_id用双引号将字符串括起来。照原样写:

export GITHUB_CLIENT_ID=891538_my_key_bf0055

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

于 2017-06-14T11:12:27.290 回答
1

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

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

当然,在生产中,您可能想尝试一些更复杂的机制,但上述方法适用于简单/开发用例,它会让您知道您的应用程序是否正确读取 ENV var。

于 2017-06-14T12:19:33.050 回答
0

对于开发——当运行时iex -S mix phx.server——你可以设置变量.iex.exs

System.put_env(%{"GITHUB_CLIENT_ID" => "891538_my_key_bf0055",
                 "GITHUB_SECRET_ID" => "1234567890asdfghjkls"})
于 2017-09-15T10:18:36.317 回答