Frage

Ich versuche, eine HTTP-Ressource anzufordern, die innerhalb einer Adobe AIR-Anwendung Basis-Autorisierungs-Header erfordert. Ich habe manuell versucht, das Hinzufügen der Header auf die Anfrage sowie unter Verwendung der setRemoteCredentials () Methode, um sie zu setzen, ohne Erfolg.

Hier ist der 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" />

Allerdings ist ein Standard-Grund auth Dialogfeld erscheint immer noch die Benutzer für ihre Benutzernamen und Passwort aufgefordert werden. Ich habe das Gefühl, ich bin dies den richtigen Weg, nicht zu tun, aber alle Infos kann ich (Flex-Dokumente, Blogs, Google, etc.) findet entweder nicht funktioniert hat oder war zu ungenau zu helfen.

Jede schwarze Magie, oh Flex-Gurus? Danke.


EDIT: Ändern setRemoteCredentials () zu setCredentials () ergibt die folgenden Actionscript-Fehler:

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

EDIT: Problem gelöst, nach einiger Aufmerksamkeit von Adobe. Siehe die Beiträge unten für eine vollständige Erklärung. Dieser Code wird für HTTP Authentication Header beliebiger Länge arbeiten.

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();
}
War es hilfreich?

Lösung

erhielt schließlich etwas Aufmerksamkeit von Adobe und bekam eine Antwort zu diesem Thema. Das Problem mit langen HTTP Authentication Header ist, dass standardmäßig wird die Base64Encoder Klasse alle 72 Zeichen Zeilenumbrüche injiziert. Offensichtlich, dass bewirkt, dass ein Stück der Base-64-codierte Zeichenfolge als neues Header-Attribut interpretiert werden, was den Fehler verursacht.

Sie können dieses Problem beheben, indem (in dem obigen Beispiel) Einstellung encoder.insertNewLines = false; Die Standardeinstellung ist wahr.

Ich habe den obigen Code festgelegt für beliebig lange Authentication Strings zu arbeiten.

Andere Tipps

Ah. Der Schmerz, das Leid. Das schiere Elend.

Während Sie herausgefunden haben, wie man einen Header hinzuzufügen, bevor Sie Ihren Anruf tätigt, die böse Wahrheit ist, dass irgendwo tief unten im Flash / Browser-Integration Raum Ihre Header wieder entfernt werden.

Von meinem Blogpost im vergangenen Jahr unter verveguy.blogspot.com

So habe ich die Wahrheit entwirrt. (Ich denke) Es ist mehr als folterte man sich vorstellen würde

1 / Alle HTTP-GET-Anfragen werden von Header abgestreift. Es ist nicht in dem Flex-Stack so ist es wahrscheinlich die zugrunde liegende Flash-Player Laufzeit

2 / All HTTP-GET-Anfragen, den Inhaltstyp haben andere als application/x-www-form-urlencoded in POST-Anforderungen einge

3 / Alle HTTP-POST-Anfragen, die keine tatsächlichen gebuchten Daten haben, werden in GET-Anfragen eingeschaltet. Siehe 1 / und 2 /

4 / Alle HTTP PUT und HTTP DELETE-Anfragen werden in POST-Anfragen gedreht. Dies scheint ein Browser Einschränkung zu sein, dass der Flash-Player mit klemmt. (?)

Was dies in der Praxis nach unten läuft darauf hinaus, dass, wenn man den Kopf passiert in all Anfragen will, sollen Sie immer POST verwenden, und Sie sollten eine anderen Weg finden, die Semantik der Operation kommunizieren Sie „wirklich wollten“. Die Rails-Community hat beim Übergang ?_method=PUT/DELETE als Arbeit um für die Browser-Probleme angesiedelt zugrunde liegenden 4 /

Da Flash die wunderbaren Header Strippen Schmerz auf GET fügt hinzu: Ich verwende auch ?_method=GET als Behelfslösung für die. Da dies jedoch bis auf 3 / Ausflüge, Ich Hindurchleiten eines Dummy-Objekt als die kodierten Daten POST. Was bedeutet, meinen Dienst Dummy gebuchten Daten auf einem ?_method=GET Anfrage ignorieren muss.

an dieser Stelle entscheidend zu 2 / wissen. Das verschwendet eine Menge meiner Zeit.

Ich habe alle diese Handhabung in eine neue RESTService Klasse mit MXML Markup Unterstützung gebaut, so ist es möglich, dies so zu tun, nicht auf der Client-Seite vorhanden sind.

Hoffe, das hilft jemand.

Die setCredentials () & setRemoteCredentials () Methoden für die Flex / Livecycle Data Services Gebrauch bestimmt sind, so dass sie wahrscheinlich in Ihrem Fall nicht gelten.

Dies sollte für Sie arbeiten. Ich war in der Lage, dieses Verhalten auf meinem Server zu reproduzieren, und dieses Update scheint den Trick getan zu haben; es scheint immer noch ein wenig seltsam dies nicht mehr API-benutzerfreundlich ist, wenn man bedenkt, wie häufig ein Anwendungsfall Sie denken würde, es waren, aber dennoch habe ich getestet und überprüft dies funktioniert, cert ein gültiges SSL gegeben:

private function authAndSend(service:HTTPService):void
{
        var encoder:Base64Encoder = new Base64Encoder();
        encoder.encode("someusername:somepassword");

        service.headers = {Authorization:"Basic " + encoder.toString()};                            
        service.send();
}

Hoffe, es hilft! Und Dank für die Buchung - ich bin sicher, ich würde eher in diese ausgeführt haben oder später selbst. ;)

Das ist wirklich hat mir geholfen! Vielen Dank! Ich verwende Flex Builder 3

Eine Anmerkung: Die WebService Eigenschaft Header nur gelesen wird. Also habe ich versucht httpheaders zu verwenden. Es funktioniert!

    var encoder:Base64Encoder = new Base64Encoder();
    encoder.insertNewLines = false;
    encoder.encode("test:test");

    sfWS.httpHeaders = {Authorization:"Basic " + encoder.toString()};   

Ich hatte das gleiche Problem, während HTTP Basic authentifiziert Webservice verbrauchen. Dies ist meine Lösung; es funktioniert:

private function authAndSend(service:WebService):void
{
    var encoder:Base64Encoder = new Base64Encoder();
        encoder.insertNewLines = false; 
        encoder.encode("user:password");
    service.httpHeaders = { Authorization:"Basic " + encoder.ToString() };
    service.initialize();
}

Verwendung

authAndSend(WebService( aWebServiceWrapper.serviceControl));

Versuchen setCredentials anstatt setRemoteCredentials verwenden und in Ermangelung eines solchen, mit Fiddler / Charles, um herauszufinden, was Header mit der Anfrage gesendet werden.

Auch, so dass andere Leute nicht verbringen 10 Minuten arbeiten, warum die korrektes Beispiel nicht ganz funktioniert asis, müssen Sie das mx.utils.Base64Encoder Paket zB importieren:

        import mx.utils.Base64Encoder;

Am Anfang oder irgendwo im Bereich CDATA. Ich bin neu zu biegen, so dass diese zunächst nicht ganz klar war.

Dies ist, wie ihre getan.

import mx.utils.Base64Encoder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;

var _oHttp:HTTPService = new HTTPService;
var sUsername:String = "theusername"
var sPassword:String = "thepassword";

var oEncoder:Base64Encoder = new Base64Encoder(); 
oEncoder.insertNewLines = false; 
oEncoder.encode(sUsername + ":" + sPassword); 

_oHttp.method = "POST";
_oHttp.headers = {Authorization:"Basic " + oEncoder.toString()}; 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top