Play 框架部署失败:"the application secret has not been set, and we are in prod mode. Your application is n



我在Heroku上部署了一个使用Play框架开发的web应用程序。部署失败,返回以下错误:

[error] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. Your application is not secure. 

we are in prod mode是什么意思?我在哪里设置模式?我必须更改这个,因为它不是生产环境。

谢谢

把它放入你的conf/application.conf

玩2.5

play.crypto.secret="changethissosomethingsecret"

玩2.6 +

play.http.secret.key="changethissosomethingsecret"

您需要在配置文件中添加一个应用程序秘密。

play.http.secret.key = " changethissosomethingsecret "

您需要根据应用程序使用的Play版本设置不同的键。

你用的是什么版本的游戏?

查看项目的plugins.sbt中的com.typesafe.play:sbt-plugin版本,或者如果您有GNU兼容的shell,请执行以下命令:

find . -name "plugins.sbt" -exec grep -PHin --color=always 'com.typesafe.play.*sbt-plugin.*%s*"K.*?(?=")' {} ;

进入下一步,一旦你知道你的应用程序使用的播放版本号。


application.conf中根据play版本使用的键是什么?

2.3。x: application.secret(默认为changeme)
2.4。x: play.crypto.secret(默认为changeme)
2.5。x: play.crypto.secret(默认为changeme)
2.6。x: play.http.secret.key(默认为changeme)

正如你所看到的,它是不一致的,但是一致的是:

  1. 在上面的版本中,您可以使用APPLICATION_SECRET环境变量/属性(因此,类似APPLICAITION_SECRET="changed" sbt "runProd 9001")覆盖secret
  2. 默认为changeme

接下来的两个选项是在Play v2.6.x上测试的,但根据文档,v2.4.xv2.5.x应该使用相同的命令。唯一的例外是v2.3.x,它分别使用play-generate-secretplay-update-secret

如何让sbt为我生成密钥?

在播放应用程序(使用sbt v1.1.6和play v2.6.x进行测试)的目录中运行以下命令:

$ sbt playGenerateSecret | grep -i 'generated'
[info] Generated new secret: ^7UubY[rFXzkN:v6TB9WL/lfGsP61/vzAHA9tdZNZ@nALH=TEztKAlTC>xz;VUXw

你可以手动复制上面的值作为键的值(基于之前提到的play框架版本)或者,你可以使用下面的建议。

如何让sbt自动更新application.conf中的现有密钥?

同上,在play框架应用的根目录下运行以下命令:

$ sbt playUpdateSecret | grep -i "secret"
[info] Generated new secret: Kz?fHm_I[wt^Onp[@cr<:`ttrQi]KMsdDs>22hEF?RhkoanQ7gA6NAjL33EV2^Xt
[info] Updating application secret in /Users/blah/someplayapp/conf/application.conf
[warn] Did not find application secret in /Users/blah/someplayapp/conf/application.conf
[warn] Adding application secret to start of file
关于该命令需要注意的几点:
  1. playUpdateSecret将更新现有的秘密,或者在application.conf中添加一个不存在的秘密。
  2. 此命令查找键和/或仅在application.conf 中添加/更新键。如果您遵循最佳实践,这一点很重要。这个最佳实践是指创建一个单独的production.conf,覆盖application.conf:

    中的这个键。

    包括"应用程序"

    play.http.secret.key = " somesecretkey "

,然后像这样运行你的应用:

/path/to/yourapp/bin/yourapp -Dconfig.file=/path/to/production.conf

正如你所看到的,如果你使用playUpdateSecret来生成一个新的秘密,那么它将没有效果,因为它被production.conf中指定的秘密覆盖了。

在生产模式下运行应用程序之前,需要生成一个应用程序秘密

您需要在生产模式下为应用程序生成令牌,使用activator playGenerateSecret

配置应用秘密

链接文档

相关内容

最新更新