J'utilise auth0 pour l'authentification et j'utilise l'une des méthodes fournies (copiées ci-dessous) pour confirmer le jeton jwt. La solution qu'ils fournissent frappe leur service sur chaque demande à mon serveur, ce qui rend les demandes prennent jusqu'à 1 seconde pour terminer.cache auth0 clé publique
Je tente de mettre en cache la clé publique qui est générée par la méthode qu'ils fournissent mais qui n'a pas de chance. Au début, je pensais que je peux stocker dans Rails.cache
mais réalisé la méthode crée un objet OpenSSL
, pas une chaîne, et quand j'essaie Rails.cache.write('KEY', openSslObject)
et accès avec Rails.cache.fetch('KEY')
Je reçois nul retourné
J'ai essayé aussi d'utiliser un bloquer le cache chercher des rails:
cached_jwks_hash = Rails.cache.fetch("JWKS_HASH", expires_in: 10.hours) do
get_jwks_hash
end
mais toujours obtenir nulle
la méthode get_jwks_hash
retourne ci-dessous les éléments suivants: {"key"=>#<OpenSSL::PKey::RSA:0x007fe29c545ef8>}
quelle serait la meilleure façon de mettre en cache ces données? est-il possible de stocker cela dans une variable en mémoire?
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