HTTP Basic Authentication with HTTPService Objects in Adobe Flex/AIR

Posted by Bob Somers on Stack Overflow See other posts from Stack Overflow or by Bob Somers
Published on 2009-01-29T07:53:37Z Indexed on 2010/06/13 15:02 UTC
Read the original article Hit count: 478

I'm trying to request a HTTP resource that requires basic authorization headers from within an Adobe AIR application. I've tried manually adding the headers to the request, as well as using the setRemoteCredentials() method to set them, to no avail.

Here's the code:

<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" />

However, a standard basic auth dialog box still pops up prompting the user for their username and password. I have a feeling I'm not doing this the right way, but all the info I could find (Flex docs, blogs, Google, etc.) either hasn't worked or was too vague to help.

Any black magic, oh Flex gurus? Thanks.


EDIT: Changing setRemoteCredentials() to setCredentials() yields the following ActionScript error:

[MessagingError message='Authentication not supported on DirectHTTPChannel (no proxy).']


EDIT: Problem solved, after some attention from Adobe. See the posts below for a full explanation. This code will work for HTTP Authentication headers of arbitrary length.

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();
}

© Stack Overflow or respective owner

Related posts about flex

Related posts about air