Compojure/Ring: почему сеанс с cookie-хранилищем не переживает перезапуск сервера?
У меня есть приложение compojure, которое использует оболочку сеанса вызова для хранения токена OAuth, связанного с текущим пользователем. Я хотел бы, чтобы этот токен оставался доступным при перезапуске сервера, чтобы мне не приходилось каждый раз проходить процесс аутентификации.
Я предположил, что использование cookie-хранилища вместо хранилища по умолчанию поможет, но это не так. Что мне не хватает?
Это соответствующая часть кода:
(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 ответ
Проблема заключается в том, что в вашем приложении есть 2 промежуточных программного обеспечения Wrap-сеанса, так как обработчик / сайт поставляется с ним. Это приводит к тому, что шифрование / дешифрование запускается дважды. Для настройки дескриптора сеанса 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
Чтобы сделать последний постоянным, вам нужно проверить документацию вашего выбранного сервлет-контейнера.