Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【TypeScript】TypeScriptでBasic認証をやってみる

こんばんは、葛の葉です。

今回はBasic認証をやってみます。

Basic認証とは

Basic認証とはHttpに搭載されている認証方法の一つになります。Httpヘッダーに認証のためのユーザー情報とパスワード情報をBase64にて暗号化して送付します。その値をサーバーが受け取って認証をすることが出来ます。

サーバーは対象となるページのヘッダーにWWW-Authenticateをつけることで、Basic認証にすることができます。クライアントは該当するページにアクセスした時、サーバーは401のステータスコードで返します。認証が成功すれば成功したページをステータスコード200で返します。401のステータスを受け取った時、クライアントは認証用の入力フォームを出力し、ユーザー名とパスワードをユーザーに入力させます。入力フォームを出力する機能はブラウザの機能です(ブラウザによっては出来ないものもあるということになります。)。その値はユーザー名:パスワードという一つの文字列になり、Base64にて暗号化され、HttpRequestのヘッダーAuthorizationの値としてサーバーに送信します。サーバーは受け取ったその値を使って認証を行い、成功不成功にあわせて返答します。このAuthorizationはブラウザを閉じるまで継続します。

f:id:Kuzunoha-NE:20200103201805g:plain

ソースコード

事前に必要なものは以下のコマンドになります。

$ node -v
v12.13.1
$ npm init -y
$ npm i -D typescript @types/node
$ npx tsc --init

httpでBasicAuth

今回はあえてexpressを使わずにnodeの標準でついているhttpモジュールでHttpサーバーを建ててみます。

nodejs.org

4行目const server = http.createServer();はserver変数にServerクラスのインスタンスを作成します。

6行目server.on('request', callback)はHttpRequestを受け取った際にcallbackを起動します。callbackの関数には(req:IncomingMessage, res:ServerResponse)の2つの引数を渡します。IncomingMessageはHttpRequestで、ServerResponseはサーバーとして返すHttpResponseになります。

7行目if(req.headers.authorization)はHttpRequestのヘッダーAuthorizationが存在するかしないかの条件分岐になります。ヘッダーが存在しない場合はundefinedとなるため、この条件は満たされません。条件が満たされた以降はreq.headers.authorizationを加工しているだけになります。

$ curl 127.0.0.1:9000 
401 not authenticated
$ curl -H 'Authorization:Basic a3V6dW5vaGE6aG9nZWhvZ2U=' http://127.0.0.1:9000
success

このように認証を行うことが出来ます。一方で、認証情報をBase64で暗号化するだけなので、簡単に暗号を解くことが出来ます。そのため、ほぼ平文での送信となり、盗聴された場合の安全性は足りないと言われています。そのため、Httpsとの併用が望ましいとことです。