スパイスラボ神部です。
企業のキャンペーンサイト制作などにご一緒させていただいていると、Flash の動作確認にはいろいろ苦慮することになりますが、特に大きな壁として flashによるファイルアップロードと認証に関するジレンマ - hanai にあるような
・Mac の場合、どのブラウザでも Basic 認証下ではファイルアップロードできない
という問題があります。
実はこれは Flash プラグインとしての正しい挙動で、Basic 認証下ではファイルをダウンロードさせる動作以外はサポート外なもようです(Windows 版の Flash プラグインが仕様外の部分でたまたま成功させているだけらしい)。
FileReference API の機能とセキュリティについて
サーバーが認証を必要とする場合、唯一正常に実行できる可能性があるのは、Flash Player ブラウザプラグインを使ったファイルのダウンロードです。すべての Flash Player でのアップロードや、スタンドアローンもしくは外部の Flash Player を使ってのダウンロードは、認証を必要とするサーバーでは成功しません。
では、この問題はどうやって回避したらいいでしょうか。
PHP のセッションを使って簡易な認証を行う
いきなり答えを書いてしまいましたが、この方法であればとりあえずファイルアップロードが出来ない状態を回避でき、また一種の「認証を経由した」ような効果の元で、クローズドにページの内容を確認する/してもらうことができます。
※PHP のセッション機能を使いこなしている人には、ここから先は一行も読む必要はありません。Basic 認証しか知らない人のために、Flash 確認のための回避策をまとめているだけということをご了承いただければと思います。
まずは基本的なルール作り
簡単で基本的なルールとして
・セッションというものを使う
・セッションはセッションに応じた変数を持つことができる
・セッション変数の中身をチェックすることで、コンテンツを表示するかしないかを決める
というものを頭に思い浮かべてみてください。
実際にセッションを使うときのお作法
セッションを開始するには、Basic 認証のようなポップアップダイアログではなく、mixi などの SNS にログインするときのように HTML フォームを使って自分自身を認証するフレーズやパスワードを渡すのが一般的です。
フォームの値は POST で渡すのがよいでしょう。続いて受け渡されたユーザ名とパスワードのペアを、適切な方法で認証します。最も単純で危険な方法としては、平文で渡されたそれらの値を、ソースコードに直に書かれた値と比較することです。ここは最低でも別ファイルで define したものを使うべきでしょうが、ここでは説明のために本文に直書きしておきます。
<?php
$username = htmlspecialchars($_POST['username']);
$pass = htmlspecialchars($_POST['password']);
if($username = "username" && $pass == "password"){
session_start();
$_SESSION['auth'] = true;
}
?>
ここでは、username が username、パスワードの変数 $pass が password だったときに許可されたユーザであると判断することで、session_start(); でセッションを開始しています。また同時にセッション変数である $_SESSION の 'auth' という値を true に設定します。このセッション変数は、セッションが破棄されるまで同じサイト内で継続しますので、この性質を利用して、本来隠したい情報があるページに誘導します。
セッションの有無による場合分け
一般には隠したい情報があるページに、固定リンクなどでユーザを誘導したとしましょう。その場合、真っ先に行うのはこのページでのセッション開始と、セッション変数の中に格納されている auth の値のチェックです。
<?phpsession_start();
if($_SESSION['auth'] != true){
exit;
}?>
ここでやっていることはとても簡単です。セッション変数の中に格納されている auth の値が ture でなければ、直ちにページの表示を中止して exit する、というものです。これであれば、別のページでセッションを開始して、なおかつ auth の値が true でない限りはページの内容を見ることはできません。
ということで、理屈上ではこれで一応セッションを使った認証のできあがりになります。
セッションを使うときの注意点
PHP でセッションを使う場合、デフォルトでは PHP:セッション情報をDBに持つ にありますようにファイルです。また負荷分散のためにセッション情報をDBに持つことがある、というのもこの記事の趣旨です。
session.use_cookies を ON にする などしてセッション情報を Cookie で管理する時は、セッション管理/PHP入門 にあるような点に注意が必要です。
ログアウトも実装しておこう
利用して終わった後しばらくはセッション情報がサーバに残ることで、ブラウザを再起動したあともそのサイトに接続出来てしまう場合があります。より積極的に退場してもらうために、ログアウトのリンクも付け足しておきましょう。そのリンクを辿った先のページには、下記のようなコードを置いて確実にセッション情報を破棄しておきましょう。
<?php$cmd = htmlspecialchars($_POST['cmd']);
if($cmd == "logout"){
session_destroy();
}?>
POST で "logout" というコマンドが渡されたときに、session_destroy(); を呼ぶというだけのスクリプトです。
まとめ
今回私も Basic 環境下で Mac のファイルアップロードをテストしなければいけないという特殊な状況に陥ったため、ウェブ上を探したのですがこれといってスマートな解決方法が無く、PHP の知識を用いてひとつの問題解決の方法を見いだしたところがありました。
Flash の動作確認をクローズドな環境下でクロスブラウザでしなければならない、という立場に陥る人の場合は、Basic 認証以外にたどりつくのは意外と難しいことのように思いますので、このエントリがなにかの一助になればと思います。
とはいえあまりにもニッチなノウハウなので時間をかけて共有するのもどうかなあ、と思っていたのですが、.htaccessでベーシック認証 | バシャログ。 というエントリのブックマークで id:Layzie などから選択範囲つきでスターをいただいたため、1エントリ起こすことにしてみました。
こんな感じでどうですか。報酬は1ブクマでいいぜ…。
※なお表示のため、<?php の開ブランケットは全角にしてあります。ソースコードとしてコピーする場合はご注意ください。
関連記事



コメント ( 1 )
はてブでスターを付けさせて頂いただけなのにこんなに良質なエントリを上げて頂いて感謝しています。
非常に勉強になりました!
Mac使ってるんで非常に助かります。
インターネットっていいなあ。
ありがとうございました!
投稿者: Layzie | 2009年01月14日 19:07
日時: 2009年01月14日 19:07