2012-09-19 15 views
10

Tengo una aplicación compuesta que usa el contenedor de la sesión del anillo para almacenar el token OAuth asociado con el usuario actual. Me gustaría que este token permanezca disponible cuando se reinicie el servidor, para que no tenga que pasar por el proceso de autenticación cada vez.Compojure/Ring: ¿Por qué una sesión con cookie-store no sobrevive a un reinicio del servidor?

Supuse que usar la cookie-store en lugar de la memoria-store predeterminada ayudaría, pero no es así. ¿Qué me estoy perdiendo?

Esta es la parte relevante del código:

(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 función root-handler utiliza el token para decidir si alguien está conectado o no, pero no devuelve nada en el camino de la información de la sesión.

Respuesta

11

El problema es que tiene wrap-session middlewares en su aplicación, ya que el controlador/sitio viene con uno. Esto está provocando que el cifrado/descifrado se ejecute dos veces. Para configurar la sesión compojure mango uso:

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

Además, tal vez estaría interesado en algunos de estos proyectos, que implementan el protocolo de anillo SessionStore:

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

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

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

Para que el último sea persistente necesitarás c diablos la documentación de su contenedor servlet de elección.

Cuestiones relacionadas