2012-09-19 12 views
10

Ho un'app che utilizza il wrapper della sessione circolare per archiviare il token OAuth associato all'utente corrente. Vorrei che questo token rimanesse disponibile al riavvio del server, in modo che non debba passare attraverso il processo di autenticazione ogni volta.Compojure/Ring: Perché una sessione con cookie-store non sopravvive al riavvio del server?

Supponevo che l'utilizzo del cookie-store al posto dell'archivio di memoria predefinito sarebbe stato d'aiuto, ma non lo è. Cosa mi manca?

Questa è la parte rilevante del codice:

(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 funzione root-handler utilizza il token per decidere se qualcuno è loggato o meno, ma non restituisce nulla in termini di informazioni di sessione.

risposta

11

Il problema è che nella tua app ci sono i middleware di wrap-session , dato che il gestore/sito viene fornito con uno. Ciò sta causando la crittografia/decrittografia da eseguire due volte. Per configurare la sessione compojure uso maniglia:

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

Inoltre, forse si sarebbe interessato su alcuni di questi progetti, che implementano il protocollo anello SessionStore:

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

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

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

Per rendere persistente l'ultimo occorrerà c diamine la documentazione del tuo contenitore servlet preferito.

Problemi correlati