Play Framework部署失败:"尚未设置应用程序机密,我们处于prod模式。您的申请不安全"

时间:2016-09-21 12:05:40

标签: java heroku playframework

我在Heroku上部署了一个使用Play Framework开发的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. 

这意味着"我们处于刺激模式"?我在哪里设置模式?我必须改变它,因为它不是生产环境。

由于

4 个答案:

答案 0 :(得分:3)

将它放入conf / application.conf

play.crypto.secret="changethissosomethingsecret"

You can also start your application with a source with a secret key as a parameter.

答案 1 :(得分:1)

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

您使用的是哪个版本的游戏?

要么查看项目plugins.sbt中的com.typesafe.play:sbt-plugin版本,要么,如果命令行上有findGNU grep,请执行以下命令:

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

在知道应用程序使用的播放版本号后,继续下一步。


基于播放版本在application.conf中使用的关键是什么?

Play 2.3.xapplication.secret(默认为changeme
Play 2.4.xplay.crypto.secret(默认为changeme
Play 2.5.xplay.crypto.secret(默认为changeme
Play 2.6.xplay.http.secret.key(默认为changeme

您可以看到它不一致,但是一致是:

  1. 在上述每个版本中,可以使用APPLICATION_SECRET环境变量/属性(因此,类似APPLICAITION_SECRET="changed" sbt "runProd 9001"这样的东西)来覆盖此机密
  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

您可以手动复制以上内容作为相应键的值(基于前面所述的播放框架版本),或者,可以使用以下建议。

如何获取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 中查找密钥和/或添加/更新密钥。如果您遵循Best Practice,这一点很重要。 最佳实践是指创建一个单独的production.conf来覆盖application.conf中的该键:

    包括“应用程序”

    play.http.secret.key =“ somesecretkey”

然后像这样运行您的应用程序:

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

如您所见,如果您正在使用playUpdateSecret来生成一个新机密,则它将无效,因为它已被production.conf中指定的机密所覆盖。

答案 2 :(得分:0)

  

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

您需要使用build.gradle

在生产模式下为应用程序生成令牌

Configuration Application Secret

Link documentation

答案 3 :(得分:0)

您需要在conf文件中添加应用程序密钥。

play.http.secret.key =“ changethissosomethingsecret”