我正在使用Rails secret_key_base编码和解码JSON web令牌,我的secret_key_base在credential .yml.enc文件中。在其中一个测试中,我使用这个函数来解码JWT,在本地测试运行良好,但在github操作上它失败了,我发现了rails .应用程序.凭据的值。在github action上运行测试时,Secret_key_base为nil。我修复了这些测试,模拟如下
allow(Rails.application.credentials).to receive(:secret_key_base).
and_return("secret")
是否有一种方法我不必在github上为其他凭据执行此操作。亦自大师。我希望我能看到这个错误
ActiveSupport::MessageEncryptor::InvalidMessage
同时读取凭据文件,但这也没有发生。这是一个链接到我的项目,如果你清楚的东西。
在Rails 6中,可以为每个环境创建credentials.yml.enc文件。
在vscode:
EDITOR="code --wait" rails credentials:edit --environment production
EDITOR="code --wait" rails credentials:edit --environment test
得到production.key, production.yml.enc, test.key, test.yml.enc
。然后,您可以将test.key
提交到github进行测试,或者更好的是,在RAILS_TEST_KEY
env中设置此键。
虽然维护两个env文件有点棘手。您可以创建带有空envs的credenetials.yml.example
文件以供参考
我认为'最干净/正确的方式'做到这一点是添加主密钥(值从config/master.key)到github的秘密。
转到存储库设置->secrets(左侧菜单)->new repository secret。将其命名为RAILS_MASTER_KEY是有意义的。然后在你的工作流文件中添加
env:
RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
就是这样,Rails将足够聪明地在凭证解密中使用该变量。
不需要制作额外的凭证文件。对我来说,它只使用一个凭据。myl .enc
编辑:更好的是,如果您可以跳过使用凭据,添加heroku配置变量SECRET_KEY_BASE
,并在config/application.rb
中添加
config.secret_key_base = ENV['SECRET_KEY_BASE']
,生产使用Rails.configuration.secret_key_base
,用于测试/开发Rails.application.secrest.secret_key_base
,它是由rails设置的
。
SECRET_KEY = Rails.env.production? ? Rails.configuration.secret_key_base : Rails.application.secrets.secret_key_base
这样你就不必在每一台运行你的应用程序的机器上存储主密钥。例如:同事,github动作,登台,生产。