Elixir 如何在Phoenix应用程序中设置conn.secret\u key\u base

Elixir 如何在Phoenix应用程序中设置conn.secret\u key\u base,elixir,phoenix-framework,Elixir,Phoenix Framework,我在Phoenix应用程序中遇到以下错误: https://github.com/phoenixframework/phoenix/blob/2861f0db3df3d81ee6ce79f928ef4e0b439c4dcd/installer/templates/new/config/config.exs#L16 cookie存储需要设置conn.secret\u key\u base 它似乎来自my PostController模块中此身份验证功能的重定向(至:会话路径(conn,:new)

我在Phoenix应用程序中遇到以下错误:

https://github.com/phoenixframework/phoenix/blob/2861f0db3df3d81ee6ce79f928ef4e0b439c4dcd/installer/templates/new/config/config.exs#L16
cookie存储需要设置conn.secret\u key\u base

它似乎来自my PostController模块中此身份验证功能的重定向(至:会话路径(conn,:new))行:

  defp authenticate(conn, _opts) do
    if conn.assigns.current_user do
      conn
    else
      conn
      |> put_flash(:error, "You must be signed in to post a project.")
      |> redirect(to: session_path(conn, :new))
      |> halt()
    end
  end  
显然,此错误意味着需要设置conn.secret\u key\u base


在何处以及如何设置此值?

在创建phoenix应用程序时,默认情况下应指定此值:

https://github.com/phoenixframework/phoenix/blob/2861f0db3df3d81ee6ce79f928ef4e0b439c4dcd/installer/templates/new/config/config.exs#L16
如果您缺少此配置,请将以下内容放入
config/config.exs

config :my_app, MyApp.Endpoint,
  secret_key_base: "some_secret",

您可以使用该任务生成您应该使用的值,而不是“some_secret”。

您可以在config/prod.secret.exs中设置该值。请注意,这不应该进入您的版本控制,因为它应该是秘密的

# config/prod.secret.exs

use Mix.Config

config :trope_api, MyApp.Endpoint,
  secret_key_base: "SOMEVERYLONGSTRING"
此文件包含在底部的config/prod.exs中

# config/prod.exs

# Finally import the config/prod.secret.exs
# which should be versioned separately.
import_config "prod.secret.exs"
除了将其排除在版本控制系统之外,另一种方法是在启动应用程序时使用环境变量进行设置

您可以通过以下方式在应用程序中访问它们:

# config/prod.exs

# Just a test vaule for env variables
config :my_app, MyApp,
  test_value: System.get_env("TESTCONFIG")
然后在启动服务器时设置它们

$ PORT=4001 MIX_ENV=prod TESTCONFIG=testvalue mix phoenix.server
如果您想在开发过程中也使用这个,您可以将变量导出到shell中。或者只需在项目根目录中创建一个名为
.env
(或任何您喜欢的)的文件,并将其添加到.gitignore中。您可以在这里添加环境变量,如下所示:

export TESTCONFIG="Test Config Value"
export OTHERTESTCONFIG="Other Test Config Value"
启动新的终端会话时,只需在项目文件夹中快速运行
source.env
。这对于数据库凭据也很有用。这样,它们就不受版本控制,更重要的是没有硬编码。因此,当您在一个团队中工作时,每个人都可以拥有自己的
.env
文件,该文件具有适合其本地开发设置(db等)的正确值


在将应用程序部署到生产环境中时,您可以使用服务器或容器中的
.env
文件,以便更轻松、更安全地启动应用程序。

关于您(现已删除)的问题:这与我在回答中描述的差不多。使用
System.get_env(“变量名称”)
访问
config/dev.exs
中的变量。如果您有很多变量或希望简化过程,请使用
.env
文件的方法。请注意:在生产过程中,此密钥需要保密。因此,在prod.secret.exs中覆盖它。“mix phoenix.gen.secret已被弃用。请改用phx.gen.secret。”-对于其他像我这样的谷歌用户。