Content from 2021-04

Caveman2でcookieのkeyとexpiresを変更する方法

posted on 2021-04-19 23:47:20

Caveman2でセッションを有効するには,app.lispにあるbuilderマクロで:sessionを書けばいいことはREADMEに書かれているのでそこは問題無いのですが,cookieのexpiresやセッション名となっているcookieキーの変更方法は書かれておらずソースを読む必要がありました.

https://github.com/fukamachi/lack/blob/master/src/builder.lispを読むとlackのミドルウェアか判別して実行する展開する箇所があります. :sessionを渡すとlack.middleware.sessionを実行するということなので,
https://github.com/fukamachi/lack/blob/master/src/middleware/session.lispを読むとstateキーのデフォルトとしてmake-cookie-stateを使っているのわかります.

app.lisp内で:lack.middleware.session.state.cookieをインポートして,builder内で
(:session :state (make-cookie-state :httponly t :cookie-key "myapp.session" :expires 1800)) すればset-cookieの値が変わっているはずです.

このcookie-stateは構造体でありhttps://github.com/fukamachi/lack/blob/master/src/middleware/session/state/cookie.lispで定義されています.

「cookieを生成した現在時刻+make-cookie-stateのexpiresキーで渡した秒数」が最終的なexpiresになるのでこの例だと30分有効ということになります.

個人的にはsamesiteを入れたいのですが入り組んでいて私ではわかりづらく難航しています.

まぁ元のlackの該当箇所を書き換えてしまった方が早いですが.

追記(2021-05-07)

私がlackに出していたPRがマージされたので現在のバージョンであれば,
(:session :state (make-cookie-state :samesite :lax)) の様にキーワードで渡してsamesiteキーワードに渡してやればSet-CookieにSameSite=Laxが追加されます.
何も指定しなければNoneになります.
Strictにするには:strictキーワードをどうぞ.

追記(2021/05/07 16:50 JST)

caveman2 projectのproject-name.asdの:depends-on内で"lack.middleware.session"かそれをインポートしているライブラリを指定する必要があるということを書いておくのを忘れていました.

追記修正(2021/06/16 JST)

上記の"lack.middleware.session"ではなく"lack-middleware-session"でした.


Unless otherwise credited all material Creative Commons License by madosuki