[RUBY] Connectez-vous avec Apple en utilisant Apple_id de gem dans Rails et cachez le JWK d'Apple

Si vous souhaitez vous connecter avec Apple dans une application Rails, vous devez vérifier id_token dans Rails car Se connecter avec Apple est, après tout, OpenID Connect. S'il s'agit de Ruby, la vérification peut être effectuée facilement en utilisant ce gem https://github.com/nov/apple_id.

Vérifiez id_token à l'aide de apple_id

id_token = AppleID::IdToken.decode(id_token)
id_token.verify!(code: code)

Vous pouvez vérifier id_token comme ceci, mais ce qui est fait dans la méthode verify! Est d'obtenir la clé publique (JWK) fournie par Apple par HTTPS et d'utiliser ce JWK pour vérifier la signature. Faire. Par défaut, elle communique avec Apple via HTTPS à chaque fois qu'elle est vérifiée, mais comme cette clé publique est rarement mise à jour, elle peut être mise en cache, et il est également souhaitable de la mettre en cache en tant qu'implémentation de serveur.

La version 1.0.0 de apple_id de gem a été récemment publiée, et avec cette mise à niveau de version, JWK peut être mis en cache n'importe où. Dans cet article, je vais vous montrer comment le mettre en cache.

Méthode de mise en cache

La méthode de mise en cache est très simple, il suffit de définir la classe qui implémente la méthode fetch qui ne prend qu'un seul argument dans AppleID :: JWKS.cache. Vous pouvez obtenir JWK en appelant yield dans la méthode fetch. Par exemple, si vous souhaitez le mettre en cache dans un processus, écrivez le code suivant.

class ProcessCache
  def initialize
    @cache = {}
  end

  def fetch(cache_key)
    @cache[cache_key] ||= yield
  end
end

AppleID::JWKS.cache = ProcessCache.new

AppleID :: JWKS.cache est défini comme une variable de classe, donc en tant qu'implémentation de la classe Cache, vous pouvez l'affecter à une variable d'instance et elle sera mise en cache dans le processus. Même si vous souhaitez l'enregistrer dans un fichier, un serveur de cache, une base de données, etc. au lieu d'un processus, vous pouvez le remplacer en implémentant la méthode fetch de la même manière, ce qui est pratique. La classe Cache doit être implémentée sous app ou lib, préparez config / initializers / apple_id.rb, etc., et affectez-y AppleID :: JWKS.cache.

Recommended Posts

Connectez-vous avec Apple en utilisant Apple_id de gem dans Rails et cachez le JWK d'Apple
Japaneseize en utilisant i18n avec Rails
Implémentez la fonction de connexion simplement avec le nom et le mot de passe dans Rails (3)
[Ruby on Rails] Comment se connecter avec seulement votre nom et mot de passe en utilisant le bijou