概要
- 特定のUser-Agentを含むリクエストだったら無条件でアクセスを許可する
- それ以外はBasic認証をかける
上記の要件が提示されたので、Nginxで設定してみた。
注意点
なお、そもそもNginxにおけるlocationコンテキスト内でのifディレクティブの利用は非推奨とされているので注意。
(予期せぬ動作が起きるなど、意図通りに制御できない場合が多い)
https://mogile.web.fc2.com/nginx_wiki/start/topics/depth/ifisevil/
今回の環境は短期利用の想定であること、かつ検証用であることから許容している。
実装例
location / {
set $target_ua 0;
if ($http_user_agent = "<TARGET-USER-AGENT>"){
set $target_ua 1;
}
if ($target_ua = 1){
set $auth_basic off; #対象のUAならBASIC認証オフ
}
if ($target_ua = 0){
set $auth_basic "Restricted"; #それ以外ならBASIC認証有効化
}
auth_basic $auth_basic;
auth_basic_user_file /etc/nginx/.htpasswd;
}
結果
User-Agentを含まないリクエストにはBasic認証がかかる。
$ curl -I <URL>
HTTP/2 401
中略
www-authenticate: Basic realm="Restricted"
対象のUser-Agentを含むリクエストには認証なし。
$ curl -H "User-Agent: <TARGET-USER-AGENT>" -I <URL>
HTTP/2 200
以下略
対象ではないUser-Agentを含むリクエストにはBasic認証がかかる。
$ curl -H "User-Agent: <UNTARGET-USER-AGENT>" -I <URL>
HTTP/2 401
中略
www-authenticate: Basic realm="Restricted"
参考文献