Compojure/Ring: 为什么使用 cookie-store 的会话在服务器重启后无法保存?

10

我有一个使用ring会话包装器存储与当前用户关联的OAuth令牌的compojure应用程序。我希望在服务器重新启动时该令牌仍然可用,以便我不必每次都经过身份验证流程。

我认为使用cookie-store而不是默认的memory-store会有所帮助,但事实并非如此。我错过了什么吗?

这是代码的相关部分:

(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"})})))

root-handler函数使用令牌来判断是否有人已登录,但不会返回任何会话信息。

1个回答

11

问题是你的应用程序中有2个wrap-session中间件,因为handler/site自带一个。这导致了加密/解密被运行两次。要配置compojure会话处理程序,请使用:

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

此外,也许您会对这些项目之一感兴趣,它们实现了环形SessionStore协议:

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

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

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

要使最后一个持久化,您需要查看所选的servlet容器的文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接