如何在Phoenix应用程序中设置conn.secret_key_base

时间:2016-03-31 12:20:50

标签: elixir phoenix-framework

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

cookie store expects conn.secret_key_base to be set

它似乎来自我的PostController模块中此身份验证函数的|> redirect(to: session_path(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_key_base。

我在哪里以及如何设置此值?

2 个答案:

答案 0 :(得分:12)

创建凤凰应用程序时,应默认指定:

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",

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

答案 1 :(得分:4)

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

public class LeftArrow
{
    private int tail=15;
    private int width=7;

    //Method to draw the left arrow    
    public void DrawArrow()
    {
        for(int i = 0,r=0; i<width; i++)
        {
            //for spaces before head
            for(int j=0;j<(width/2)-r;j++)
                    System.out.print(" ");

            for(int j=0;j<=r;j++)
            {
                if(j==r || j==0)
                System.out.print("*");
                else
                System.out.print(" ");//for spaces inside head
            }
            if(i==width/2)//to draw tail after the mid of head
                ArrowTail();

            if(i<width/2)//controls the increment & decrements of spaces before head
                r++;
            else r--;

            System.out.println();
        }
    }

    // method to draw the arrow tail
    public void ArrowTail()
    {
        for(int count=0; count<tail; count++)
        {
            System.out.print("*");
        }
    }

    public static void main(String[] args)
    {
        LeftArrow Arrow = new LeftArrow();
        Arrow.DrawArrow();
    }
}

此文件包含在底部的

中的config / prod.exs中
# config/prod.secret.exs

use Mix.Config

config :trope_api, MyApp.Endpoint,
  secret_key_base: "SOMEVERYLONGSTRING"

除了将其从版本控制系统中移除之外的另一种方法是在启动应用程序时使用环境变量进行设置。

您可以在应用中访问它们,如下所示:

# 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")

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

.env

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

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