Adobe AIRでBASIC認証する方法

手法は二つある。どちらを選ぶかは……さて。

例題として、twitter投稿をしてみよう。これはネットにたくさんある記事の抜粋で私オリジナルではないが、試してみるとちゃんと動くので流用させて貰っている。オリジナルが誰かは知らないけどよくできていて、Base64エンコードをURIエンコードに置き換えたり値の渡し方をいじった位でそれ以外はほとんど元のままである。元作者さんに感謝を。

なお、入力値は以下である。環境はUbuntu9.04+Adobe AIR SDK+Adobe Flex SDKでコンパイル・テスト等している。

項目 内容
host twitter.com
email 登録メールアドレス
pass パスワード
st つぶやき内容
username twitterアカウント
private function postTwitter(host:String, email:String, pass:String, st:String):void{
  var Loader:URLLoader = new URLLoader();
  var urlReq:URLRequest = new URLRequest("http://"+host+"/statuses/update.xml");
  /* ここで認証しない場合、以下はいらない */
  trace(email,pass);
  var auth:* = encodeURI(email + ":" + pass);
  var reqHead:* = new URLRequestHeader("Authorization", "Basic " + auth);
  urlReq.requestHeaders.push(reqHead);
  /* ここで認証しない場合、以上はいらない */
  urlReq.method = URLRequestMethod.POST;
  urlReq.contentType = "application/x-www-form-urlencoded";
  urlReq.cacheResponse = false;
  urlReq.useCache = false;

  var uv:URLVariables = new URLVariables();
  uv.decode("status="+st);
  urlReq.data = uv;

  Loader.addEventListener(ProgressEvent.PROGRESS,trace);
  Loader.addEventListener(IOErrorEvent.IO_ERROR,trace);
  Loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, trace);
  Loader.addEventListener(HTTPStatusEvent.HTTP_STATUS,trace);
  Loader.load(urlReq);
}

見るとわかると思うが、認証ヘッダをpushでリクエストに押し込むという方法で実装している。なるほどわかりやすい方法だが、個人的には以下の方が美しいと思う。

    URLRequestDefaults.setLoginCredentialsForHost(host,username,pass);

これを一発実行しておけば、このアプリ上では余計な事を考えなくても良い。簡単だ。これを書く場合、上のリストはコメントに従って認証部分を外して欲しい。

ちなみに余談。 両方そのまま書いておくとブラウザと同様に認証ダイヤログが開くが、うまく機能しないようだ 。たぶん内部でおかしな事になってるんじゃないかな。ハマるので要注意です。