2008年8月8日金曜日

RESTのHTTP認証

RESTアプリケーションをシステム間で採用する場合に認証処理を
利用することがよくありますが、プロバイダー側では提供するサービスによっては
複数の認証情報を扱わなければならないことがあります。

1.接続元システムの認証
2.プロバイダーが提供する会員のための認証

その認証を一緒くたには出来ないので、それぞれ認証処理を実施することになりますが、
1番はRESTなのでやはりHTTP認証(Basic,Digest等)+SSLあたりが現実的かと思います。

2番の認証のために複数のHTTP認証は利用可能でしょうか?

可能だとしても
・ログオフが出来ない。
・WSSEはplain passwordを保持しないとダメ。

のはプロバイダーとして頂けない
XML(entity)としてログイン情報を表現できるようになっていないとやっぱダメかも。

X- ヘッダー拡張して自作してみるか?
Query Stringに表現する?

2008年8月1日金曜日

イントラ用語集#5

Http Headerを取り扱う際の共通化をしたいのですが、いいサンプルが見当たりません。
RESTを取り扱う際には出来るだけServletAPI依存せずにHeaderを扱いたいのですが、
大抵はみかけるのは解析時にMapになっている程度のようです。

出力時にも便利な方法をさがしているのですが、

Restlet
でも実装のほうはcom.noelios.restlet.http.HttpConstantsで

public static final String HEADER_ACCEPT = "Accept";
public static final String HEADER_ACCEPT_CHARSET = "Accept-Charset";
public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
で宣言されてるだけ?みたいです。たぶん。


public class FieldName {
public static final FieldName ACCEPT = new FieldName("Accept", StringField.class);
public static final FieldName ACCEPT_CHARSET = new FieldName("Accept-Charset", StringField.class);
public static final FieldName IF_MODIFIED_SINCE = new FieldName("If-Modified-Since", DateField.class);
}

こんな感じで作ってみました。
ここで、ペアのStringField.classやDateField.classは出力時、解析時の
共通インターフェースをもつクラスです。

ここで問題になるのは、やっぱり拡張ヘッダーの扱いです。
このクラスはライブラリとして利用したいので逐一このクラスに追加される
のはやめておきたいので

public static final ArrayList<FieldName> EXTEND_FIELDS = new ArrayList<FieldName>(3);

拡張用の領域を設けてみて
(ArrayListの初期サイズに特別な意図はないです・・・)

public class XFieldName {
public static final FieldName X_WSSE = new FieldName("X-WSSE", StringField.class);

static {
FieldName.addFieldName(X_WSSE);
}
}


利用するプロジェクトで追加していくことでなんとかなるかもしれません。
このクラスを先にロードしてHTTPのリクエストが来る前に拡張ヘッダを追加しないと
いけないですよね。Servlet load処理にうまく関連づければいいのかな。

これで行ってみようと思います。