Safari限定で面倒な問題が発覚。たぶんWindows版とMac版の両方のSafariで起こる。自分で確かめたのはWindows版だけど、Mac持ちのスタッフに試してもらったら同じ挙動だと言われたので。
症状
サーバーには以下のようにファイルを配置。
1 2 3 |
protected (BASIC認証必要なディレクトリ) +- test.html +- sample_movie.mp4 |
test.htmlには以下のように動画を埋め込む。
1 2 3 |
<video id="video1" controls> <source src="sample_movie.mp4" type="video/mp4"> </video> |
Safariからtest.htmlにアクセスすると、BASIC認証を求められる。これは期待通りの挙動。
認証を通過してtest.htmlを表示すると、再びBASIC認証を求められる。これは期待外。ダイアログボックスの体裁は先ほどとは違って、Windows組み込みの認証ダイアログボックス。
どうして2度の認証を求められるのか?
ウェブブラウザのアクセスログ(XAMPP環境のApache)を見たら一目瞭然。
1 2 |
::1 - - [15/Dec/2014:09:46:56 -0800] "GET /test.html HTTP/1.1" 200 7782 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2" ::1 - - [15/Dec/2014:09:46:56 -0800] "GET /sample_movie.mp4 HTTP/1.1" 200 463521618 "-" "QuickTime/7.7.6 (qtver=7.7.6;os=Windows NT 6.1Service Pack 1)" |
おおよそのシナリオは以下の通りで正解だと思う。
Safariはtest.htmlをロードしたら埋め込まれている動画の再生をキックするのだけど、動画再生は外部アプリ(ヘルパーアプリ)であるQuickTimeによって行われる。SafariとQuickTimeは完全に独立したアプリなので、SafariのBasic認証セッションはQuickTimeには引き継がれない。したがって、QuickTimeが動画にアクセスするときには再び認証が求められる。
2度目の認証をスキップするにはどうするか?
2度目の認証をしないようにする仕組みをサーバー側に仕込む必要があるだろうな。独自の認証処理を備えた動画データ送出のスクリプトを作成して、それをパスワード保護されないディレクトリに配置して、認証と動画送出の処理を自前で行うとか。でも、Safariだけのためにそこまでしたくないというのが正直な気持ち。