Rails secret_key_base를 heroku 프로덕션 환경에서 적용

6337 단어 루비Rails
프로덕션에서 Rails.application.secrets.secret_key_base로 인해 프로덕션에서 jwt를 사용할 수 없으므로 메모를 남깁니다.

오류의 원인 조사



오류 로그
heroku logs -tail
2021-10-25T12:59:16.093104+00:00 heroku[router]: at=info method=OPTIONS path="/v1/accounts" host=api-slack-react-ruby.herokuapp.com request_id=b010205a-d1b1-4436-aa04-ad84e944e2ea fwd="153.246.218.124" dyno=web.1 connect=0ms service=1ms status=200 bytes=287 protocol=https
2021-10-25T12:59:16.273962+00:00 heroku[router]: at=info method=GET path="/v1/accounts" host=api-slack-react-ruby.herokuapp.com request_id=0e2bccc5-9a32-4ccf-9689-e8e375ea8556 fwd="153.246.218.124" dyno=web.1 connect=0ms service=3ms status=500 bytes=374 protocol=https
2021-10-25T12:59:16.271652+00:00 app[web.1]: I, [2021-10-25T12:59:16.271587 #4]  INFO -- : [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] Started GET "/v1/accounts" for 153.246.218.124 at 2021-10-25 12:59:16 +0000
2021-10-25T12:59:16.272513+00:00 app[web.1]: I, [2021-10-25T12:59:16.272471 #4]  INFO -- : [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] Processing by V1::AccountsController#callback as HTML
2021-10-25T12:59:16.273001+00:00 app[web.1]: I, [2021-10-25T12:59:16.272917 #4]  INFO -- : [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] Completed 500 Internal Server Error in 0ms (ActiveRecord: 0.0ms | Allocations: 130)
2021-10-25T12:59:16.273322+00:00 app[web.1]: F, [2021-10-25T12:59:16.273291 #4] FATAL -- : [0e2bccc5-9a32-4ccf-9689-e8e375ea8556]
2021-10-25T12:59:16.273322+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] JWT::DecodeError (No verification key available):
2021-10-25T12:59:16.273323+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556]
2021-10-25T12:59:16.273323+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] lib/j_w_t/helper.rb:12:in `decode'
2021-10-25T12:59:16.273324+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] app/models/concerns/j_w_t/authenticatable.rb:23:in `authenticate!'
2021-10-25T12:59:16.273325+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] app/controllers/concerns/authenticatable.rb:15:in `authenticate_account!'

보면

2021-10-25T12:59:16.273322+00:00 app[web.1]: [0e2bccc5-9a32-4ccf-9689-e8e375ea8556] JWT::DecodeError (No verification key available):

여기가 원인이라고 생각합니다.

해당 코드는 다음과 같습니다.

helper.rb
def decode(token, verify: true, **opts)
  JWT.decode(token, Rails.application.secrets.secret_key_base, verify, **opts)
end

원인으로서는 Rails.application.secrets.secret_key_base가 수상하다고 생각했기 때문에 조사해 보면. . .
heroku run bash
rails c
Rails.application.secrets.secret_key_base


역시 nil이 돌아왔다.

조금 원인 조사가 길어졌지만 여기에서 해결하겠습니다.

시도한 방법


  • rails console에서 Rails.application.secrets.secret_key_base의 값을 얻은 후 heorku 환경 변수에 SECRET_KEY_BASE를 설정합니다.

    변함없이. . .
  • heroku 환경 변수에 RAILS_MASTER_KEY 세트
  • heroku config:set RAILS_MASTER_KEY=cat config/master.key
    


    변함없이. . .
  • Rails.application.secret.secret_key_base를 Rails.application.credentials.secret_key_base로 변경

  • helper.rb
    def decode(token, verify: true, **opts)
      JWT.decode(token, Rails.application.secrets.secret_key_base, verify, **opts)
    end
    

    helper.rb
    def decode(token, verify: true, **opts)
      JWT.decode(token, Rails.application.credentials.secret_key_base, verify, **opts)
    end
    


    잘 갔다! ! !

    결론



    heroku의 환경 변수에 RAILS_MASTER_KEY를 설정하고 Rails.application.secret.secret_key_base를 Rails.application.credentials.secret_key_base로 변경하면 성공했습니다!

    성공한 이유를 살펴보면 Rails는 5.1부터 비밀 정보를 secret.yml이 아니라 credentials.yml.enc로 관리하게 된 것 같다.

    그 때문에, secret_key_base의 참조처도 secrets에서 credentials로 바뀌었다고 하는 것이다.
    또, 은닉 정보를 보기 위해서는 master key를 환경 변수에 세트 할 필요가 있기 때문에 2.에서 시험한 것도 유효했다고 생각된다.

    꽤 시간을 사용해 버렸지만, 해결할 수 있어서 좋았다.

    좋은 웹페이지 즐겨찾기