G::blog

主にVert.xやYokeについての覚書

Yoke でセッションを管理する

今回は、Yoke のセッション管理の方法についての短い記事になります。

1. セッション管理に関する資料

Yoke でセッションを管理するには、 Middleware の CookieParserSession(現在ページが存在しません) を組み合わせて使います。

これらを組み合わせた使い方についての説明は、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" という名前のクッキーはブラウザから削除されます。