端くれプログラマの備忘録 Safari [Safari] パスワード保護されたディレクトリに置いた動画を再生しようとすると再び認証を求められる件

[Safari] パスワード保護されたディレクトリに置いた動画を再生しようとすると再び認証を求められる件

Safari限定で面倒な問題が発覚。たぶんWindows版とMac版の両方のSafariで起こる。自分で確かめたのはWindows版だけど、Mac持ちのスタッフに試してもらったら同じ挙動だと言われたので。

症状

サーバーには以下のようにファイルを配置。

protected (BASIC認証必要なディレクトリ)
+- test.html
+- sample_movie.mp4

test.htmlには以下のように動画を埋め込む。

<video id="video1" controls>
 <source src="sample_movie.mp4" type="video/mp4">
</video>

Safariからtest.htmlにアクセスすると、BASIC認証を求められる。これは期待通りの挙動。

safari_auth

認証を通過してtest.htmlを表示すると、再びBASIC認証を求められる。これは期待外。ダイアログボックスの体裁は先ほどとは違って、Windows組み込みの認証ダイアログボックス。

qt_auth

どうして2度の認証を求められるのか?

ウェブブラウザのアクセスログ(XAMPP環境のApache)を見たら一目瞭然。

::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だけのためにそこまでしたくないというのが正直な気持ち。