【前提】
- index.html→ダウンロードページにplistへのリンクを設定してある
ex. <a href="itms-services://?action=download-manifest&url=https://hogehoge/install/hogehoge.plist">install app</a>
- hogehoge.plist
- hogehoge.ipa
が入っている。
Webサーバはnginx、かつ/install以下はBasic認証により保護される
【発生した問題】
単純に/install以下をbasic認証とした場合、
index.htmlでBasic認証→hogehoge.plistでBasic認証→hogehoge.ipaでBasic認証、と3回もID/PWの入力が必要となる。
アクセスログを見ると以下のようになっている
"GET /install/index.html HTTP/1.1" 401 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS(略)" "GET /install/hogehoge.plist HTTP/1.1" 401 "-" "itunesstored/1.0 (略)" "GET /install/hogehoge.ipa HTTP/1.1" 401 "-" "com.apple.appstored/1.0(略)"
最初(index.html)のbasic認証の後、そのままではplistとipaの取得時にそれぞれ別のクライアントからの接続があるため、Basic認証の承認状態が引き継がれずに都合3回ID/PWの入力が必要となる。
このため、UAを見て
- itunesstored
- com.apple.appstored
に前方一致なら許可とした。
【hogehoge.conf】
server { # port listen 443; (中略) # for install pages set $auth "Restricted"; if ($http_user_agent ~ (itunesstored|com.apple.appstored)) { set $auth off; } location ^~ /install { auth_basic $auth; auth_basic_user_file /etc/nginx/conf.d/.htpasswd; root /path/to/root/; } (中略) }
UAを偽装されてしまうとどうしようもないけど、まあこんなもんかな……