web-dev-qa-db-de.com

phonegap: Cookie-basierte Authentifizierung (PHP) funktioniert nicht [webview]

Ich arbeite an einer mobilen Web-App mit Sencha Touch, HTML5 und Phonegap als Wrapper.

Ich benutze PHP-Authentication (Cookie) und Ajax-Requests. Auf Safari oder Chrome funktioniert alles einwandfrei, aber nach dem Deployment mit phonegap (Webview) funktioniert es nicht mehr ...

Jede Hilfe wäre dankbar :)

Einige weitere Details:

Alle Daten für meine App werden über Ajax-Requests auf meine Serverkomponente "mobile.php" geladen. Ich benutze grundlegende PHP-Auth, um den Benutzer zu authentifizieren:

  1. AJAX-Request [Benutzername, Passwort] -> mobile.php -> Sitzung aufgebaut (Cookie)
  2. Alle anderen Anfragen, wenn die Authentifizierung erfolgreich war

Was ist der Unterschied zwischen einer normalen Safari-Website und der Webansicht?

27
meaku

ich habe es herausgefunden:

sie müssen die Datei phonegap_delegate.m ändern und der init-Methode Folgendes hinzufügen:


- (id) init
{   
    /** If you need to do any extra app-specific initialization, you can do it here
     *  -jm
     **/
    //special setting to accept cookies via ajax-request
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage 
                                          sharedHTTPCookieStorage]; 
    [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

    return [super init];
}

es ermöglicht Webview, Cookies von Ajax-Anfragen zu akzeptieren

27
meaku

Wenn Ihre Phonegap AJAX -Anfragen nicht wie vorgesehen Rückrufe auslösen, ist dies möglicherweise der Grund.

Wenn die Antwort, die Sie erhalten, Versuche, Cookies zu setzen, und Sie Michaels Fehlerbehebung nicht durchgeführt haben, schlägt Ihre (jquery) AJAX -Anforderung leise fehl - weder Erfolg noch Fehler: Rückrufe werden trotzdem ausgelöst Der Server hat die Anfrage tatsächlich empfangen und eine Antwort gesendet. Sie müssen dies anscheinend auch dann tun, wenn Ihnen die Cookies egal sind.

Ich hoffe das hilft jemandem.

Die Kekse waren mir egal, aber ich habe nur ein paar Stunden damit verbracht herauszufinden, warum die Rückrufe nicht ausgelöst wurden!

2
NAD

Es gibt eine Lösung, die auch für Android funktioniert:

Installieren Sie das Plugin https://github.com/wymsee/cordova-HTTP , um beliebige HTTP (S) -Anforderungen auszuführen.

Ersetze XMLHttpRequest durch die Plugin-Alternative (cordovaHTTP.get oder cordovaHTTP.post):

cordovaHTTP.post("https://example.com/login", {email: '[email protected]', passwd: "s3cr3t"}, {}, function(response) {
    console.log('success');
    console.log(response);
}, function(response) {
    console.log('failure');
    console.log(response);
});

Die Antwort enthält Status, Daten und response.headers["Set-Cookie"], die nach Name, Wert, Domäne, Pfad und sogar HttpOnly-Flags analysiert werden können ;-)

Das Cookie kann in LocalStorage gespeichert und bei nachfolgenden Anforderungen (siehe cordovaHTTP.setHeader() oder header Parameter der .get/.post Methoden) gesendet werden, um einen authentifizierten Benutzer in einem Desktop-Browser zu simulieren.

0
Ferdinand.kraft