2015-05-20 6 views
11

Ich benutze Ionic, um ein Login-System auf Codeigniter/Ion_Auth/codeigniter-restclient zu bauen und wenn ich versuche, mich von "ionic server" anzumelden, funktioniert die Anmeldung, aber die nächste API-Anfrage an die Methode logged_in() gibt false zurück.Warum "klebt" die Anmeldesitzung nicht, wenn ich mich im "ionic dienste" -Fenster anmelde, aber funktioniert, wenn ich den Browser auf den www-Ordner zeige?

Das Gleiche funktioniert ordnungsgemäß, wenn ich den Browser auf den www-Ordner verweisen.

So, hier ist das Problem Schritt für Schritt:

  1. Lauf ionischen

  2. Sie das Anmeldeformular (http://localhost:8100/#/app/login)

  3. E-Mail eingeben siehe dienen und übergibt

  4. Der Rest api gibt "Login erfolgreich"

  5. zurück
  6. $ state.go ('app.profile') arbeitet und leitet auf http://localhost:8100/#/app/profile

  7. REST erhalten api/logged_in gibt false zurück, und ich Umleitung auf die Login-Seite

Wenn ich das gleiche tun In einem normalen Browser wird Schritt 1 zu: Öffnen Sie den Browser und gehen Sie zu http://localhost:8888/App/www/#/app/login, bei Schritt 6 REST get api/logged_in gibt true zurück und ich werde nicht auf die Anmeldeseite umgeleitet, ich bleibe auf der Profilseite.

Der Code ist derselbe. Ich vermute also, dass ion_auth möglicherweise nicht die gewünschten Cookies erhält oder die Sitzung zurückgesetzt wird. Ich bin mir nicht sicher, was das Problem ist. Dies ist mein erstes Ionic/App-Projekt so könnte ich etwas über die richtige Art und Weise von einer mobilen App zu authentifizieren fehle Code, der in Browsern funktioniert

Danke

UPDATE: Es scheint, dass bei der Verwendung der ' Fenster des ionischen Servers Jede Anfrage an die API löst eine neue Sitzung aus. Die neue Sitzung wird in der Datenbank gespeichert, und ion_auth testet die Protokolldatei auf die letzte Sitzung, die nicht die Anmeldedaten enthält.

+0

ist die Frage für Sie klar? für mich nicht. Ich habe es mehrmals versucht, um es zu verstehen, aber in der Tat, das ist obscur. Bitte klären Sie, was Sie haben, was Sie getestet haben und was Ihr Problem ist. – aorfevre

+0

Ich habe eine Schritt für Schritt Erklärung hinzugefügt, hoffentlich hilft es – orbitory

+0

Erklärung ist viel besser so. – aorfevre

Antwort

2

Sie nahmen über REST API und Cookies und Sitzungen. Cookies und Sitzungen gehören nicht zur REST-Philosophie. Here is why.

Lassen Sie mich Ihnen sagen, wie wir dieses Problem in unserem Projekt erreichen. Die grundlegende Art zu wissen, welcher Benutzer anfragt und ob er die Zugriffsrechte hat, ist der Kopfzeilenwert 'Authorization'. Sie können Basic Authentication, Barer oder andere verwenden.

Wir bevorzugen in der Regel Token-basierten Autorisierungssystem. Wenn eine Anmeldung erfolgreich ist, sendet der Server ein Token. In der ionischen App speichern wir sie unter Verwendung einer factory namens SessionService. Wann immer sich ein Benutzer anmeldet, wird Token gespeichert und für jede Anfrage verwendet. Das Token geht jedoch verloren, wenn der Benutzer die App schließt. So können wir es im lokalen Speicher speichern. Der Benutzer kann dann direkt zum Dashboard weitergeleitet werden, bis sich der Benutzer abmeldet.

app.factory("SessionService", function($window){ 
    var user={}; 

    if ($window.localStorage['user']!=undefined){ 
     user=JSON.parse($window.localStorage['user']); 
     console.log(user); 
    } 

    return{ 
     isLoggedIn:function(){ 
      return !isEmpty(user); 
     }, 
     logout:function(){ 
      console.log("logout") 
      user={}; 
      $window.localStorage.clear(); 
     }, 
     setUser:function(data){ 
      user=data; 
      $window.localStorage['user']= JSON.stringify(user); 
     }, 
     getUser:function(){ 
      return user; 
     } 
    } 
}) 

in jeder Web-Anfrage Jetzt können Sie SessionService.getUser().token aufrufen, wenn Wert Authorization Kopfeinstellung.

UPDATE:

Trotz Verwendung von Cookies ist nicht zu empfehlen, können Sie es in Ihrer Anwendung leicht benutzen.

Wenn Sie Anfrage mit CORS senden, Winkel sendet keine Cookies mit Anfrage. Eine der Art und Weise Adresse dieses Problem withCredentials: true bei jeder Anfrage zu senden ist:

$http({withCredentials: true, ...}).get(...) 

Weitere diesen here.

Hoffe, das hilft!

+0

Während ich zustimme, dass Cookies nicht die beste Art sind, mit APIs zu arbeiten (und zu diesem Zeitpunkt werde ich versuchen Sie wahrscheinlich eine lokale Speicherlösung) es bedeutet nicht, dass sie als Funktionalität entfernt wurden. Oder waren sie? Aus meiner Sicht sollten Cookies funktionieren, auch wenn es nicht empfohlen wird. – orbitory

+0

Ich erinnere mich daran, es zu versuchen, werde es noch einmal versuchen, danke – orbitory

Verwandte Themen