2012-09-19 1 views
10

J'ai une application compojure qui utilise l'encapsuleur de session en anneau pour stocker le jeton OAuth associé à l'utilisateur actuel. Je souhaite que ce jeton reste disponible lorsque le serveur redémarre, de sorte que je n'ai pas à passer par le processus d'authentification à chaque fois. J'ai supposé que l'utilisation du cookie-store à la place du magasin de mémoire par défaut aiderait, mais ce n'est pas le cas. Qu'est-ce que je rate?Compojure/Ring: Pourquoi une session avec cookie-store ne survit-elle pas à un redémarrage du serveur?

Ceci est la partie pertinente du code:

(defn auth-callback-handler 
    [session {code :code}] 
    (let [token (retrieve-token code)] 
    (-> (redirect "/") (assoc :session (assoc session :token token))))) 

(defroutes app-routes 
    (GET "/" {session :session} (root-handler session)) 
    (GET "/auth-callback" {session :session params :params} (auth-callback-handler session params)) 
    (route/not-found "Not Found")) 

(def app 
    (-> (handler/site app-routes) 
     (wrap-session {:store (cookie-store {:key "a 16-byte secret"})}))) 

La fonction root-handler utilise le jeton de décider si quelqu'un est connecté ou non, mais ne retourne rien de la façon de l'info de la session.

Répondre

11

Le problème est que vous avez middlewares wrap-session dans votre application, car le gestionnaire/site est livré avec un. Cela provoque l'exécution du chiffrement/déchiffrement deux fois. Pour configurer l'utilisation de la poignée de session compojure:

(def app 
    (site app-routes {:session {:store (cookie-store {:key "a 16-byte secret"})}})) 

De plus, vous seriez peut-être intéressé par certains de ces projets, qui mettent en œuvre le protocole anneau SessionStore:

https://github.com/sritchie/couch-session

https://github.com/wuzhe/clj-redis-session

https://github.com/rmarianski/servlet-session-store

Pour rendre le dernier persistant, vous devrez c Heck la documentation de votre conteneur de servlet de choix.

Questions connexes