15 min/d

ぼうずやのにっき

expressのbasicAuthミドルウェアを試す。

expressのbasicAuthミドルウェアを試す。読む。しばらくexpress/connectのミドルウェアを読んで、試していく予定。

その前に簡単に前提知識を整理するために概要を書いておく。

まず、expressはNode.jsのWebアプリケーションフレームワークである。おそらくデファクトスタンダードRubysinatraにインスパイアされたもので、ルーティングとミドルウェアとを中心にしてシンプルな動きをするフレームワークである。

ルーティングはまあ置いておくとして、ミドルウェアとは何かを書く。ミドルウェアは要するにフィルタのようなもので、リクエストやレスポンスを通して何か変わるとそんな感じ。リクエストやレスポンスを各ミドルウェアが順に処理し、機能を提供する。例えば、BASIC認証であったり、gzip圧縮だったり、cookieのparseだったり、CSRF対策だったり、POSTのbodyのparseだったりする。前述のルーティングだって言ってしまえば、特定のパスへのアクセスを特定の関数にルーティングするという機能を持ったミドルウェアとも言える。

今日のbasicAuthもそのミドルウェアのひとつである。BASIC認証を提供するミドルウェア。

で、ちょっと話は脱線する。npmのページを見ると分かるのだけれど、expressはconnectを使っており、ミドルウェアに関してはconnectのものをそのまま使えるようになっている。なので、「expressを知りたければconnectを読め」なんてのを見るくらいにconnectのミドルウェアを読むのは大切である。今回のbasicAuthもexpressがconnectのものを読みこんでいるだけである。expressのbasicAuthはconnectのbasicAuthである。expressをgrepしてもbasicAuthはない。connectのmiddlewareをすべて読み込んでいるだけだからだ。それが冒頭で「express/connect」と書いたわけ。

で、話を戻す。basicAuthの話に。basicAuthの使い方はドキュメントにもあるので説明はそんなにしない。app.use(express.basicAuth(user,pass));の一行か、app.use(express.basicAuth(function(user,pass) { return true; }));か、あるいはapp.use(express.basicAuth(function(user,pass,fn) { return fn(null, 'user'); }));。これで十分な気がする。bouzuya/express-middleware-basicauthで試したものを残している。

内部動作としてはcallbackまたはuserpassを使って判定して、req.userのデータを見て、ああだこうだしている。ソース参照。複雑なことはしていない。

気になったのが、この間書いたexpress-resourceとの関係。auto-loadingを使うとreq.userに値を入れられることがあって、大丈夫か不安だったのだけれど、簡単に試した感じだと問題はなさそう。basicAuthをルーティングより先に設定しておくべきなのは間違いない。

ええと、そもそもexpressでBASIC認証なんてしない気もするけれど、そこは気にしない方向で。

45 min.