Ich verwende Adapter-based authentication in native iOS applications, um meine native ios-Anwendung (swift) mit dem Mobilefirst-Server (7.0) zu verbinden.Der Mobilefirst-Server gibt den Fehler 403 nach der Sitzungszeitlimitbehandlung in einer nativen ios-Anwendung zurück.
Der Mechanismus der Authentifizierung funktioniert gut, aber das Problem tritt auf, wenn die Sitzung nach 10 Minuten abläuft.
Hier können Sie den Teil des Codes sehen, wo ich die Authentifizierung und die Session-Timeout Griff:
override func isCustomResponse(response: WLResponse!) -> Bool {
if response != nil && response.responseJSON != nil {
let responseJson: NSDictionary = response.responseJSON as NSDictionary
if responseJson.objectForKey("authRequired") != nil{
return responseJson.objectForKey("authRequired") as! Bool
}
}
return false
}
override func handleChallenge(response: WLResponse!) {
NSLog("A login form should appear")
if self.vc.navigationController?.visibleViewController!.isKindOfClass(LoginViewController) == true {
NSLog("Already the login form")
dispatch_async(dispatch_get_main_queue()) {
let loginController : LoginViewController! = self.vc.navigationController?.visibleViewController as? LoginViewController
let myInvocationData = WLProcedureInvocationData(adapterName: "AuthenticationJavaAdapter", procedureName: "authenticate")
myInvocationData.parameters = [loginController.userID, loginController.userPass]
self.submitAdapterAuthentication(myInvocationData, options: nil)
}
} else if (self.vc.navigationController?.visibleViewController!.isKindOfClass(SignUpViewController) == true) {
NSLog("Already the signup form")
dispatch_async(dispatch_get_main_queue()) {
NSLog("AuthenticationJavaAdapter")
let sigupController : SignUpViewController! = self.vc.navigationController?.visibleViewController as? SignUpViewController
let myInvocationData = WLProcedureInvocationData(adapterName: "AuthenticationJavaAdapter", procedureName: "authenticate")
myInvocationData.parameters = [sigupController.userID, sigupController.userPass]
self.submitAdapterAuthentication(myInvocationData, options: nil)
}
}else { //TEST
NSLog("A login form is not there yet")
//After 10 minutes this will execute, it will perform a unwind segue to the login
//timeOutController is a global var declared in LoginViewController
timeOutController.performSegueWithIdentifier("logOutDueToTimeOut", sender: nil)
}
}
Wenn die Sitzung im Hintergrund ist die Anwendung abläuft und dann in den Vordergrund kommt zurück und ruft einen geschützten Adapter dieser Teil des Code ausgeführt wird.
timeOutController.performSegueWithIdentifier("logOutDueToTimeOut", sender: nil)
die Login-Ansicht Lasten mit Erfolg und ich kann wieder die Anmeldeinformationen einreichen einzuloggen in dem Problem ist, dass meine Anwendung nicht mehr in der Lage ist, an den Mobilefirst-Server zu authentifizieren, bekommen th Fehler:
[DEBUG] [WL_REQUEST] -[WLRequest requestFinished:] in WLRequest.m:385 :: no token present
2016-05-13 12:58:29.241 BNNDesignCollection[46327:318014] [DEBUG] [WL_PUSH] -[WLPush updateToken:] in WLPush.m:410 :: Server token is (null)
....
....
....
2016-05-13 12:58:29.352 BNNDesignCollection[46327:318014] [DEBUG] [WL_AFHTTPCLIENTWRAPPER_PACKAGE] -[WLAFHTTPClientWrapper requestFailed:error:] in WLAFHTTPClientWrapper.m:335 :: Response Status Code : 403
2016-05-13 12:58:29.352 BNNDesignCollection[46327:318014] [DEBUG] [WL_AFHTTPCLIENTWRAPPER_PACKAGE] -[WLAFHTTPClientWrapper requestFailed:error:] in WLAFHTTPClientWrapper.m:336 :: Response Error : Expected status code in (200-299), got 403
Es scheint, dass die Anforderung nicht ein Token hat oder ungültig ist, aber ich habe nicht den „authrequired“ -Feld in der JSON-Antwort erhalten, so dass ich nicht noch einmal authentifizieren kann, wie ich tat Beim ersten Mal authentifiziert sich die Anwendung vor einem Timeout der Mobilefirst-Sitzung.
Der detaillierte Schritt für Schritt Ausführung ist dieses:
- Die Anwendung zeigt den Anmeldebildschirm für den Benutzer
- Der Benutzer gibt die Anmeldeinformationen
- als geschützte Adapter während dieses Prozesses aufgerufen wird, die Der mobilefirst Server gibt eine Antwort mit "authrequired = true" zurück. Die isCustomResponse-Methode wird automatisch aufgerufen und gibt "true" zurück.
- Wenn isCustomResponse den Wert true zurückgibt, wird die Methode handleChallenge aufgerufen, und da der visible ViewController der loginViewController ist, wird die erste "If" -Anweisung ausgeführt, die die Authentifizierung startet.
- Die Authentifizierung ist erfolgreich und der Benutzer kann jetzt durch die Anwendung navigieren, indem er auf alle geschützten Ressourcen zugreift.
- Ich legte die Anwendung im Hintergrund für 10 Minuten (Etablierte MobileFirst Session Timeout auf dem Server).
- Ich legte die Anwendung in den Vordergrund und starten die Navigation erneut.
- Nachdem die MobileFirst-Sitzung abgelaufen ist, gibt der mobilefirst-Server nach dem Versuch, einen geschützten Adapter erneut anzurufen, eine Antwort mit "authrequired = true" zurück. Die isCustomResponse-Methode wird automatisch erneut aufgerufen und gibt "true" zurück.
- Wenn isCustomResponse true zurückgibt, wird die Methode handleChallenge aufgerufen, und da der visible viewController NICHT der loginViewController ist, wird die dritte "If" -Anweisung ausgeführt, die den Anmeldebildschirm erneut anzeigt.
- Der Benutzer gibt die Anmeldeinformationen ein.
- Der Server gibt eine 403-Antwort zurück. Die isCustomResponse-Methode wird automatisch aufgerufen, gibt aber false zurück, da die Antwort das Feld "authrequired" nicht enthält.
Irgendwelche Ideen, wie man damit umgeht?
Woher wissen Sie (im Code), dass die Sitzung abgelaufen ist? Sie haben geschrieben, dass Sie nach Ablauf der Sitzung einen Übergang durchführen, aber ich sehe nirgends in Ihrem Code den Teil, der eine Zeitüberschreitung feststellt. –
Die isCustomResponse-Methode des Challenge-Handlers wird jedes Mal aufgerufen, wenn eine Antwort vom Server empfangen wird. Wenn isCustomResponse den Wert true zurückgibt, ruft das Framework die Methode handleChallenge auf. Dies geschieht, wenn in der Antwort ein Feld "authRequired" erkannt wird. Wenn die Sitzung abläuft und ein geschützter Adapter aufgerufen wird, gibt isCustomResponse true zurück und die Methode handleChallenge wird ausgeführt. Diese Erkennung funktioniert einwandfrei und der Anmeldebildschirm wird erneut geladen.Bei einer erneuten Anmeldung gibt der worklight-Server das Feld "auth required" nicht erneut zurück, um die Authentifizierung erneut auszuführen. –
Sorry, verstehe ich immer noch nicht. "Aber, wenn du dich wieder anmeldest" - was meinst du mit login nochmal? Wenn 'isCustomResponse' wahr zurückgegeben wird, bedeutet dies, dass Sie 'auth required' wie erwartet erhalten haben. Bitte aktualisieren Sie Ihre Frage Schritt für Schritt mit sehr detailliert, einschließlich Code-Schnipsel. –