Rails secret_key_base를 heroku 프로덕션 환경에서 적용
오류의 원인 조사
오류 로그
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이 돌아왔다.
조금 원인 조사가 길어졌지만 여기에서 해결하겠습니다.
시도한 방법
↓
변함없이. . .
heroku config:set RAILS_MASTER_KEY=cat config/master.key
↓
변함없이. . .
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.에서 시험한 것도 유효했다고 생각된다.
꽤 시간을 사용해 버렸지만, 해결할 수 있어서 좋았다.
Reference
이 문제에 관하여(Rails secret_key_base를 heroku 프로덕션 환경에서 적용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nozomi_i/items/ff33cf4b1ba59a049ab3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)