我使用auth0進行身份驗證,並使用其提供的方法之一(複製如下)來確認jwt令牌。他們提供的解決方案在每次向我的服務器發送請求時都會提供服務,這使得請求最多需要1秒才能完成。cache auth0公鑰
我試圖緩存由他們提供的方法生成但沒有運氣的公鑰。起初,我以爲我可以將其存儲在Rails.cache
但後來意識到該方法將創建一個OpenSSL
對象,而不是一個字符串,當我嘗試Rails.cache.write('KEY', openSslObject)
與Rails.cache.fetch('KEY')
我得到零返回
訪問我也試圖用與軌道緩存塊存取:
cached_jwks_hash = Rails.cache.fetch("JWKS_HASH", expires_in: 10.hours) do
get_jwks_hash
end
但仍獲得零
下get_jwks_hash
方法返回以下內容:{"key"=>#<OpenSSL::PKey::RSA:0x007fe29c545ef8>}
什麼是緩存這些數據的最佳方式?是否有可能將其存儲在內存中的變量?
def verify(token, jwks_hash)
JWT.decode(token, nil,
true, # Verify the signature of this token
algorithm: 'RS256',
iss: "https://#{ENV["AUTH0_DOMAIN"]}/",
verify_iss: true,
aud: ENV["AUTH0_API_AUDIENCE"],
verify_aud: true) do |header|
jwks_hash[header['kid']]
end
end
def get_jwks_hash
jwks_raw = Net::HTTP.get URI("https://#{ENV["AUTH0_DOMAIN"]}/.well-known/jwks.json")
jwks_keys = Array(JSON.parse(jwks_raw)['keys'])
Hash[
jwks_keys
.map do |k|
[
k['kid'],
OpenSSL::X509::Certificate.new(
Base64.decode64(k['x5c'].first)
).public_key
]
end
]
end