【问题标题】:Elixir Phoenix setting and using environment variablesElixir Phoenix 设置和使用环境变量
【发布时间】:2017-11-14 16:52:11
【问题描述】:

我有一个 phoenix 应用程序正在对 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=code&scope=user%2Cpublic_repo 的 URL `

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

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

【问题讨论】:

    标签: oauth elixir phoenix-framework ueberauth


    【解决方案1】:

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

    prod.exs配置中,可以使用

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

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

    Distillery Docs

    【讨论】:

    • 今晚我将查看 Distillery 文档并了解如何将其实施到我的项目中。如果一切顺利,我会将其标记为正确答案。谢谢迈克!
    【解决方案2】:

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

    export GITHUB_CLIENT_ID=891538_my_key_bf0055

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

    【讨论】:

      【解决方案3】:

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

      执行您的应用程序

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

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

      【讨论】:

      • 这也是我的研究一直引领着我的方向。我发现在生产中,最好将这些变量存储在prod.secret.exs 中。如果我要将密钥存储在此文件中,那么如何访问它们?目前,为了开发,这就是我获取密钥的方式。 github.com/Fallenstedt/elixir-discuss/blob/master/config/…
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-11-08
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 2022-12-04
        • 2021-12-31
        • 2013-03-04
        • 2015-10-21
        • 2018-08-28
        相关资源
        最近更新 更多