2015-12-09 11 views
5

Ich habe ein Projekt, wo ich Moya mit RxSwift Erweiterungen verwende. Die einfachen Anwendungsfälle funktionieren gut, ich bin in der Lage, Anfragen zu machen und Antworten in Form von Observablen zu erhalten.Behandlung Re-Authentifizierung mit RxSwift und Moya

Ich kann dann das Observable abonnieren und die Antwort ohne Probleme drucken.

Aber jetzt muss ich mit der Authentifizierungslogik umgehen. Die Art, wie es funktioniert, besteht darin, dass ich die obige Anfrage mit einem Token, das als HTTP-Header-Feld hinzugefügt wurde, ausführe. Moya erlaubt mir, dies transparent zu machen, indem ich endpointByAddingHTTPHeaderFields in der endpointClosure. Kein Problem bis jetzt.

Das Problem entsteht, wenn die Anforderung mit dem Status HTTP ausfällt 401, das heißt, ich brauche durch Aufruf eines anderen Endpunkt

provider.request(.auth(user, pass)).retry(5) 

Das gibt eine andere beobachtbare erneut zu authentifizieren, dass ich leicht zu JSON Karte können die neue zu bekommen Zeichen.

Ich muss dann nur noch test() aufrufen!

Also meine Frage ist ... Wie kann ich diese Authentifizierungslogik innerhalb des Test() Funktion oben hinzufügen, so dass die beobachtbare von Test() zurück garantiert bereits die Wieder laufen haben Authentifizierungslogik im Falle eines Fehlers und das Ergebnis einer zweiten erneut authentifizierten Anfrage sein.

Ich bin sehr neu in RXSwift und RX im Allgemeinen, so bin ich ein wenig ratlos über die Operatoren, die ich verwenden würde, um dies zu tun.

Danke!

+0

Haben Sie das jemals gelöst? – tskulbru

+0

Kommt der 401 als Fehler oder ist er ein gültiges Antwortobjekt? –

+0

Wenn der ehemalige, könnte diese Antwort Ihnen helfen: http://stackoverflow.com/questions/35841054/rxswift-user-input-on-error-and-continuation/38341690#38341690 –

Antwort

0
public func test(with authToken: String) -> Observable<Response> { 
    return provider 
     .request(.test) 
     .endpointByAddingHTTPHeaderFields(["Authorization": authToken]) 
     .catchError { error in 
     if needsReauth(error) { 
      return provider.request(.auth(user, pass)).map { parseToken($0) } 
      .flatMap { token in 
       return test(with: token) 
      } 
     } else { 
      return .error(error) 
     } 
     } 
} 

catchError ermöglicht beobachtbaren Hinrichtung unter Verwendung eines anderen beobachtbaren fortzusetzen. Das Observable, das wir hier definieren, macht folgendes:

  1. Zuerst wird der .auth Endpunkt angefordert.
  2. Es liest dann aus der Antwort, um das neue Authentifizierungs-Token zu erhalten
  3. Schließlich rufen wir rekursiv test(with authToken: String), um die Abfrage des Test Enpoint erneut zu versuchen.
Verwandte Themen