前の記事の続き
Node.js だとフレームワークとか使ってないと自分でユーザ名とパスワードを分解して認証処理をすることになるので 工夫すればできそう
1 つめは総当たり
「a:b:c:d」だと ユーザ名とパスワードの区切りを / で表すと
a / b:c:d
a:b / c:d
a:b:c / d
の 3 パターン
全部に対してマッチするユーザ情報がないか試してみてマッチするのがあればそのユーザとして認証
ユーザに a / b:c:d と a:b:c / d の 2 つが存在すると意図しない方にログインしてしまうのでマッチするのが複数ある場合はエラーにする
ただ これだと重複するユーザができたらエラーになって絶対ログインできない
2 つめはエスケープ
標準で用意されてないなら自分ですればいいじゃない ということで
「a:b / c:d」 みたいなユーザ名にコロンがあるとダブルクオート必要にする
ユーザはユーザ名に 「"a:b"」 って入力する必要があるようにする
サーバ側ではユーザ名がダブルクオートで囲まれてたら除去する
ユーザ名にダブルクオートを含む場合のエスケープも考える必要あり
「"a:b"」 ってユーザ名なら 「"""a:b"""」 が入力になる
サーバ側で対応してる必要あるし 標準の Basic 認証とは違ってしまうので特にオススメはしない
限られたユーザのみでどうしてもコロン使いたいと言われたときの最終手段?
Node.js だと Basic 認証の認証情報はこうすればとれます
auth は通常のアクセスだと undefined ですが
レスポンスヘッダに WWW-Authenticate が設定されていて 出てきたダイアログにユーザが入力するとここに値が入ります
user と pass をいれると 「Basic dXNlcjpwYXNz」 になります
「Basic 」 の後ろは base64 エンコードされたものなので デコードすると 「user:pass」 になります
これを見るとユーザ名やパスワードに「:」を使うとどうなるのか気になります
エスケープされるのかなーと ユーザ名とパスワードにコロンいっぱい入れると
Basic YTpiOmM6ZDplOmY=
コロンがいっぱい
区切りの場所がわからないですね
ググってみてもコロンをエスケープする方法はなくてユーザ名にコロン入れられないと書いた Stackoverflow のページが見つかりました
仕様的にも不可能みたい
最初のコロンで分割されるのでパスワードの方にはあっても大丈夫みたいです
http.createServer((req, res) => {
const auth = req.headers.authorization
console.log(auth)
})
auth は通常のアクセスだと undefined ですが
レスポンスヘッダに WWW-Authenticate が設定されていて 出てきたダイアログにユーザが入力するとここに値が入ります
user と pass をいれると 「Basic dXNlcjpwYXNz」 になります
「Basic 」 の後ろは base64 エンコードされたものなので デコードすると 「user:pass」 になります
これを見るとユーザ名やパスワードに「:」を使うとどうなるのか気になります
エスケープされるのかなーと ユーザ名とパスワードにコロンいっぱい入れると
Basic YTpiOmM6ZDplOmY=
atob("YTpiOmM6ZDplOmY=")
// "a:b:c:d:e:f"
コロンがいっぱい
区切りの場所がわからないですね
ググってみてもコロンをエスケープする方法はなくてユーザ名にコロン入れられないと書いた Stackoverflow のページが見つかりました
仕様的にも不可能みたい
最初のコロンで分割されるのでパスワードの方にはあっても大丈夫みたいです