Elixir Phoenix 设置和使用环境变量
Elixir Phoenix setting and using environment variables
我有一个正在对 github 进行 OAuth 调用的 phoenix 应用程序。我想将我的密钥存储为环境变量,这样我就可以将它们置于版本控制之外。
我创建了一个名为 .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 页面。不过我注意到 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 中使用环境变量?
如果使用 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
环境变量设置的版本。
您不应使用双引号将 client_id
字符串括起来。按原样写:
export GITHUB_CLIENT_ID=891538_my_key_bf0055
在启动您的服务器或 IEx 之前,请不要忘记 source .env
。
如果您希望您的 ENV 变量仅在您的应用进程中保持可见,您可以将它们放入 .env 文件并使用
执行您的应用
env $(cat .env | grep -v ^# | xargs) iex -S mix phoenix.server
当然,在生产中你可能想尝试一些更复杂的机制,但上面的方法适用于 simple/dev 用例,它会让你知道你的应用程序是否正确读取 ENV 变量。
用于开发 – 当 运行 by iex -S mix phx.server
– 您可以在 .iex.exs
:
中设置变量
System.put_env(%{"GITHUB_CLIENT_ID" => "891538_my_key_bf0055",
"GITHUB_SECRET_ID" => "1234567890asdfghjkls"})
我有一个正在对 github 进行 OAuth 调用的 phoenix 应用程序。我想将我的密钥存储为环境变量,这样我就可以将它们置于版本控制之外。
我创建了一个名为 .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 页面。不过我注意到 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 中使用环境变量?
如果使用 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
环境变量设置的版本。
您不应使用双引号将 client_id
字符串括起来。按原样写:
export GITHUB_CLIENT_ID=891538_my_key_bf0055
在启动您的服务器或 IEx 之前,请不要忘记 source .env
。
如果您希望您的 ENV 变量仅在您的应用进程中保持可见,您可以将它们放入 .env 文件并使用
执行您的应用env $(cat .env | grep -v ^# | xargs) iex -S mix phoenix.server
当然,在生产中你可能想尝试一些更复杂的机制,但上面的方法适用于 simple/dev 用例,它会让你知道你的应用程序是否正确读取 ENV 变量。
用于开发 – 当 运行 by iex -S mix phx.server
– 您可以在 .iex.exs
:
System.put_env(%{"GITHUB_CLIENT_ID" => "891538_my_key_bf0055",
"GITHUB_SECRET_ID" => "1234567890asdfghjkls"})