Yoke でセッションを管理する
今回は、Yoke のセッション管理の方法についての短い記事になります。
1. セッション管理に関する資料
Yoke でセッションを管理するには、 Middleware の CookieParser と Session(現在ページが存在しません) を組み合わせて使います。
これらを組み合わせた使い方についての説明は、Yoke のコミッターの Paulo さんが、Googleグループにポストされている次のメッセージが現時点では一番詳しいと思います(現時点では、公式のドキュメントでは十分な記述がされていません)。
・ https://groups.google.com/d/msg/vertx/2DrXx-E8Zso/1Tv4xOfCjy0J
2. 実際に動くコード
実際に動かしてみるのが手っ取り早いと思いますので、Pauloさんが Vert.xの Googleグループにポストされたメッセージ中のコードを踏襲して、実際に動くコードにしてみました。
package com.jetdrone.yoke; import javax.crypto.Mac; import org.vertx.java.core.Handler; import org.vertx.java.platform.Verticle; import com.jetdrone.vertx.yoke.Yoke; import com.jetdrone.vertx.yoke.middleware.CookieParser; import com.jetdrone.vertx.yoke.middleware.Router; import com.jetdrone.vertx.yoke.middleware.Session; import com.jetdrone.vertx.yoke.middleware.YokeRequest; import com.jetdrone.vertx.yoke.util.Utils; public class SessionSampleVerticle extends Verticle { public void start() { final Mac hmac = Utils.newHmacSHA256("my super secret signature secret key"); // create Yoke final Yoke yoke = new Yoke(vertx); // since sessions are stored in cookies we need to parse then so use the // cookie parser middleware yoke.use(new CookieParser(hmac)); // i don't want to bother with session validation so lets use the // Session middleware yoke.use(new Session(hmac)); // lets code our app yoke .use(new Router() // use this path check that the cookies are ok on your browser debugger .get("/", new Handler<YokeRequest>() { @Override public void handle(YokeRequest request) { System.out.println(request.getSessionId()); request.response().end(); } }) // go here to create a new session .get("/new", new Handler<YokeRequest>() { @Override public void handle(YokeRequest request) { // setting the sessionId informs the session middleware // to create a session cookie request.setSessionId("some generated secure id string here"); request.response().end(); } }) // go here to delete the session .get("/delete", new Handler<YokeRequest>() { @Override public void handle(YokeRequest request) { // setting sessionId to null is same as delete session request.setSessionId(null); request.response().end(); } })) .listen(8080); } }
(Yoke の Ver. 1.0.0-beta2で動作確認をしました)
/new にアクセスすると、"yoke.sess" という名前のクッキーをブラウザが食べます。
値は、"s:some generated secure id string here.E817WXRKKY9FZqdDy1ym07mWDEG91+PQ" といったものが設定されます。
その値の "." 以降の文字列は、セッションIDの改ざんが行われないように、Mac を利用して生成されたサインになっています。また、値の先頭にある"s:"は、そのクッキーの値にはサインが含まれていることを明示しています。
/ にアクセスすると、現在のセッションIDが、コンソール(ターミナル)に出力されます。
/delete にアクセスすると、"yoke.sess" という名前のクッキーはブラウザから削除されます。