Мое приложение использует Firebase
.
Для получения сертификата существует метод public_securetoken_keys
.
Он использует стандартную библиотеку Rails, net/http
.
Вот и все.
def public_securetoken_keys
if (public_keys = Rails.cache.read('firebase_public_securetoken_keys')).present?
return public_keys
end
uri = URI("https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
req = Net::HTTP::Get.new(uri.path)
response = https.request(req)
if response.code != '200'
raise "Something went wrong: can't obtain valid JWT public keys from Google."
end
max_age = response["cache-control"][/max-age=(\d+?),/m, 1]
public_keys = JSON.parse(response.body)
Rails.cache.write('firebase_public_securetoken_keys', public_keys, expires_in: max_age.to_i)
public_keys
end
Но я получил ошибку в response = https.request(req)
.
Это сообщение об ошибке.
1) PortalApi::V1::SessionController POST #sessionate with valid email returns a success response
Failure/Error: response = https.request(req)
NoMethodError:
undefined method `encoding' for #<Hash:0x00007fc8de1b2700>
В моем коде нет метода encoding
и я не мог видеть более подробную информацию о запросе http и проследить это.Вот почему я не смог выяснить, где в этом коде пропущена часть.
Но когда я отправляю запрос с curl https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com
в моей консоли, API успешно возвращает мне открытые ключи.
Я хочу знать, где используется метод encoding
и как это исправить.