10

現在のユーザーに関連付けられた OAuth トークンを格納するためにリング セッション ラッパーを使用する compojure アプリがあります。サーバーの再起動時にこのトークンを引き続き使用できるようにして、毎回認証プロセスを実行する必要がないようにしたいと思います。

デフォルトのメモリストアの代わりにクッキーストアを使用すると役立つと思いましたが、そうではありません。私は何が欠けていますか?

これは、コードの関連部分です。

(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はトークンを使用して、誰かがログインしているかどうかを判断しますが、セッション情報の方法で何も返しません。

4

1 に答える 1

11

問題は、ハンドラー/サイトに 1 つ付属しているため、アプリに2 つのラップ セッション ミドルウェアがあることです。これにより、暗号化/復号化が 2 回実行されます。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

最後の 1 つを永続化するには、選択したサーブレット コンテナーのドキュメントを確認する必要があります。

于 2012-09-19T23:22:40.300 に答える