2014-04-25 10 views
5

Ich weiß, dass dies unzählige Male gefragt wurde, aber keine der Antworten, die ich fand, beschrieb die tatsächliche Verbindung zum Backend.Wie kann man herausfinden, ob der Benutzer immer noch mit der sessionbasierten Authentifizierung angemeldet ist?

Ich habe eine einseitige JS-App, die mit kleinen Backend (Django) API kommuniziert. Ich benutze Session-basierte Authentifizierung. Benutzerinformationen werden beim ersten Laden zwischengespeichert. Wenn die Sitzung abläuft, muss ich den Seitenkopf ändern und die Benutzerinformationen aus dem Cache leeren. Die meisten meiner API-Ressourcen sind jedoch öffentlich und geben immer 200 zurück. Mehrere andere Ressourcen sind privat und geben 403 zurück, wenn der Benutzer nicht angemeldet ist. Das ist großartig, da mir genau die Informationen zur Verfügung stehen, die ich brauche. Das Problem besteht darin, dass einige Seiten nur auf öffentliche Ressourcen zugreifen. Falls die Sitzung plötzlich im Backend gelöscht wird und der Benutzer zur URL navigiert, die nur auf öffentliche Ressourcen zugreift, werden Benutzerinformationen nicht geleert und ich habe ein UX-Problem.

Meine ursprüngliche Idee war, private Benutzer Ressource (nennen wir es /users/self/) bei jeder URL Änderung, die 200 zurückgibt, wenn Benutzer authentifiziert wird und 403, falls sie nicht authentifizieren. Dies erfordert jedoch eine zusätzliche Anfrage vor jeder anderen Anfrage für jede URL-Änderung, was nicht wirklich ideal ist.

Gibt es irgendwelche einfacheren Techniken, die ich in diesem Fall verwenden könnte? Es macht mir nichts aus, sogar zu einer anderen Art von Authentifizierung zu wechseln, wenn das das Problem lösen würde.

Antwort

2

Was ich für solche Szenarien getan und gesehen habe, ist eine Art HTTP-Interceptor zu verwenden, der alle HTTP-Anfragen von Angular abfängt und wenn es einen Antwortstatus von 401 findet, erzeugen solche Interceptors ein Ereignis mit $rootScope.

Siehe eine Bibliothek hier https://github.com/witoldsz/angular-http-auth

es zu nutzen, ein auf die Ereignisse abonnieren muss erhöhung irgendeine Art von Root-Controller verwenden, die den Benutzer zur Login-Seite umleiten.

Sehen Sie ein Beispiel hier https://medium.com/opinionated-angularjs/7bbf0346acec

+0

Das Problem ist, dass die meisten Antworten öffentlich sind und immer 200 zurückgeben. Es wäre nicht sinnvoll, 403/401 zurückzugeben, wenn die Sitzung abgelaufen ist. –

+0

@ OndrejSlinták nicht Routen auf dem Server, die eine Sitzung mit offenen öffentlichen Routen benötigen. Das wird später mehr Arbeit für dich schaffen. – cgTag

+0

Was Sie sagen, ist, dass die öffentlichen Antworten von einer eingeschränkten Ressource abhängig sind, was bedeutet, dass entweder sie selbst eingeschränkt werden sollten oder in irgendeiner Weise auf die eingeschränkte Ressource zugreifen sollten, die eine Authentifizierungsumleitung beim Zugriff verursacht. – Chandermani

1

Statt eine zusätzliche Authentifizierungsanfrage zu senden, nur in jeder Anforderung im Backend überprüfen, ob die Sitzung nur knapp sein Ziel ab. Wenn der Benutzer nicht auth ist, geben Sie einen Statuscode zurück.

In angularjs verwendeten wir einen httpResponse Interceptor, der jede Antwort abfängt und gegen diesen Statuscode prüft.

+0

Ich kann das nicht tun, da einige URLs nur öffentliche Ressourcen anfordern, die immer 200 zurückgeben. Es würde keinen Sinn ergeben, etwas anderes zurückzugeben. –

+0

Wenn Sie jedoch nicht angemeldet sind und eine Ressource anfordern, muss eine andere Reaktion erfolgen. –

1

Wir bei der Arbeit tun, was andere Ihnen bereits gesagt haben: Verwenden Sie einen HttpInterceptor.

Wir haben jede Antwort von unserem Backend auf die gleiche Art und Weise strukturiert gesendet: ein Objekt mit zwei Feldern: eine Response und die tatsächlichen Antwort. Wir variieren den responseCode entsprechend dem, was im Backend passiert ist. Dies ist der Erfolg, die Sicherheitswarnung oder die Authentifizierung, die für die angegebene Aktion in den häufigsten Fällen erforderlich sind.

Dann reagiert der Interceptor entsprechend der von uns definierten responseCode entsprechend. Wenn eine Authentifizierung erforderlich ist, leiten wir auf die Anmeldeseite um und können alles tun, was Sie benötigen. Es funktioniert großartig für uns.

1

Ihr Back-End kann der Antwort einen Header hinzufügen, wenn der Benutzer noch angemeldet ist, unabhängig davon, ob die angeforderte Ressource öffentlich ist oder nicht. Der Client kann dann das Vorhandensein dieses Headers prüfen und entsprechend handeln.

Auf beiden Seiten wird dies mit einer Art Filter oder Abfangvorrichtung gemacht. Im Winkel wäre dies ein $http interceptor.

+0

Ich habe darüber nachgedacht, aber das würde Antwort Caching etwas härter machen. Aber das ist nur mein besonderer Fall. –

+0

@ OndrejSlinták Könnten Sie bitte Ihre Bedenken erläutern? Ich sehe nicht, wie dies das Caching beeinflussen kann. – zeroflagL

+0

In meinem Fall cache ich volle Antworten, einschließlich Header. Auf diese Weise müsste ich sie vor dem Senden der Antwort ändern. Aber ich denke immer noch darüber nach. –

Verwandte Themen