我在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
)
正如你所看到的,它是不一致的,但是一致的是:
- 在上面的版本中,您可以使用
APPLICATION_SECRET
环境变量/属性(因此,类似APPLICAITION_SECRET="changed" sbt "runProd 9001"
)覆盖secret - 默认为
changeme
接下来的两个选项是在Play v2.6.x
上测试的,但根据文档,v2.4.x
和v2.5.x
应该使用相同的命令。唯一的例外是v2.3.x
,它分别使用play-generate-secret
和play-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
关于该命令需要注意的几点:
-
playUpdateSecret
将更新现有的秘密,或者在application.conf
中添加一个不存在的秘密。 此命令查找键和/或仅在
中的这个键。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
配置应用秘密
链接文档