Adobe AIR アプリケーション内から基本認証ヘッダーを必要とする HTTP リソースをリクエストしようとしています。setRemoteCredentials() メソッドを使用してヘッダーをリクエストに手動で追加しようとしましたが、役に立ちませんでした。
コードは次のとおりです。
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
private function authAndSend(service:HTTPService):void
{
service.setRemoteCredentials('someusername', 'somepassword');
service.send();
}
private function resultHandler(event:ResultEvent):void
{
apiResult.text = event.result.toString();
}
private function resultFailed(event:FaultEvent):void
{
apiResult.text = event.fault.toString();
}
]]>
</mx:Script>
<mx:HTTPService id="apiService"
url="https://mywebservice.com/someFileThatRequiresBasicAuth.xml"
resultFormat="text"
result="resultHandler(event)"
fault="resultFailed(event)" />
<mx:Button id="apiButton"
label="Test API Command"
click="authAndSend(apiService)" />
<mx:TextArea id="apiResult" />
ただし、標準の基本認証ダイアログ ボックスが引き続き表示され、ユーザー名とパスワードの入力を求めるプロンプトが表示されます。私はこれを正しい方法で行っていないと感じていますが、見つけることができるすべての情報 (Flex ドキュメント、ブログ、Google など) は機能していないか、あまりにも漠然としていて役に立ちませんでした。
黒魔術はありますか?ありがとう。
編集: setRemoteCredentials() を setCredentials() に変更すると、次の ActionScript エラーが発生します。
[MessagingError message='Authentication not supported on DirectHTTPChannel (no proxy).']
編集:アドビからの注意の後、問題は解決しました。完全な説明については、以下の投稿を参照してください。このコードは、任意の長さの HTTP 認証ヘッダーに対して機能します。
import mx.utils.Base64Encoder;
private function authAndSend(service:HTTPService):void
{
var encoder:Base64Encoder = new Base64Encoder();
encoder.insertNewLines = false; // see below for why you need to do this
encoder.encode("someusername:somepassword");
service.headers = {Authorization:"Basic " + encoder.toString()};
service.send();
}