Używam Adapter-based authentication in native iOS applications do podłączenia mojej natywnej aplikacji ios (Swift) do serwera Mobilefirst (7.0).Serwer Mobilefirst zwraca błąd 403 po obsłudze limitu czasu sesji w natywnej aplikacji ios
Mechanizm uwierzytelniania działa poprawnie, ale problem pojawia się, gdy sesja wygasa po 10 minutach.
Tutaj można zobaczyć część kodu gdzie obsługiwać uwierzytelnianie i limit czasu sesji:
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)
}
}
Kiedy sesja wygasa jest aplikacja w tle, a następnie wraca do nowej wiedzy i wywołuje chroniony adaptera ta część kodu jest wykonywany.
timeOutController.performSegueWithIdentifier("logOutDueToTimeOut", sender: nil)
login zobacz ładunki z sukcesu i mogę złożyć ponownie poświadczenia, aby zalogować się w problemem jest to, że moja aplikacja nie jest już w stanie uwierzytelnić się na serwerze Mobilefirst, coraz th jest błąd:
[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
Wydaje się, że wniosek nie ma żeton lub jest nieprawidłowy, ale nie dostać „authrequired” pole w odpowiedzi JSON tak, że nie może uwierzytelnić znowu jak ja po raz pierwszy aplikacja uwierzytelnia się przed dowolnym limitem czasu sesji Mobilefirst.
Szczegółowe krok po wykonaniu kroku jest to jedno:
- Aplikacja pokazuje ekran logowania dla użytkownika
- użytkownik wpisze poświadczenia
- jako chronionej adapter nazywa się podczas tego procesu Serwer mobilefirst zwraca odpowiedź z "authrequired = true". Metoda isCustomResponse jest automatycznie wywoływana i zwraca wartość true.
- Jak isCustomResponse zwraca true, metoda handleChallenge nazywa i jak widać viewController jest loginViewController, pierwszy „if” jest wykonywany, uruchomienie uwierzytelniania.
- Uwierzytelnianie uda i teraz użytkownik może poruszać się w całej aplikacji dostęp do wszystkich swoich chronionych zasobów.
- Umieszczam aplikację w tle na 10 minut (ustalony limit czasu sesji MobileFirst na serwerze).
- Umieszczam aplikację na pierwszym planie i ponownie uruchamiam nawigację.
- Gdy sesja MobileFirst wygasła, raz spróbuję ponownie połączyć się z zabezpieczonym adapterem, serwer mobilefirst zwraca odpowiedź z "authrequired = true". Metoda isCustomResponse jest automatycznie wywoływana ponownie i zwraca wartość true.
- Jak isCustomResponse zwraca true, metoda handleChallenge nazywa i jak widać viewController NIE jest loginViewController, trzeci „if” jest wykonywany, pokazując ekran logowania ponownie.
- Użytkownik wpisuje dane uwierzytelniające.
- Serwer zwraca odpowiedź 403. Metoda isCustomResponse jest automatycznie wywoływana, ale zwraca wartość false, ponieważ odpowiedź nie zawiera pola "authquaint".
Wszelkie pomysły, w jaki sposób sobie z tym poradzić?
Skąd wiesz (w kodzie), że sesja wygasła? Napisałeś, że wykonujesz segue, gdy sesja wygasła, ale nie widzę nigdzie w twoim kodzie części, która wykrywa limit czasu. –
Metoda isCustomResponse obsługi wywołania jest wywoływana za każdym razem, gdy odpowiedź jest odbierana z serwera. Jeśli isCustomResponse zwróci true, struktura wywoła metodę handleChallenge i dzieje się tak, gdy w odpowiedzi zostanie wykryte pole "authRequired". Po wygaśnięciu sesji i wywołaniu chronionego adaptera metoda isCustomResponse zwraca wartość true, a metoda handleChallenge jest wykonywana. To wykrywanie działa poprawnie, a ekran logowania ładuje się ponownie.Jednak po ponownym zalogowaniu się serwer worklight nie zwraca ponownie pola "authiredqu", aby ponownie wykonać uwierzytelnianie. –
Przepraszam, wciąż nie rozumiem. "Ale, gdy zalogujesz się ponownie" - co masz na myśli po ponownym zalogowaniu? Jeśli 'isCustomResponse' zwróci true, oznacza to, że otrzymałeś' authrequired' zgodnie z oczekiwaniami. Zaktualizuj swoje pytanie BARDZO SZCZEGÓŁOWĄ krok po kroku, w tym fragmenty kodu. –