User Login

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo,

    dieses mal möchte ich mich mal an einem Login probieren. Doch bevor ich damit anfange wollte ich mir sicher sein was ich alles dafür benötige und deswegen hoffe ich das mir hier vielleicht jemand ein paar Tipps und Hinweise geben kann.

    Mein größte Sorge im Bezug auf einen Login ist eigentlich gar nicht mal der Login an sich sondern viel mehr der Umgang mit einer Session. Ich habe nämlich vor mit einem Token zu arbeiten um festzustellen ob eine Session noch aktiv ist oder eben nicht.

    Sagen wir also ich schließe die App ganz oder lasse sie im Hintergrund weiterlaufen, an welcher Stelle würde ich dann überprüfen müssen ob der Token noch aktuell oder bereits abgelaufen ist ?
    Ich frage weil ich nämlich mal etwas über Funktionen namens "func applicationDidEnterBackground" usw. gelesen habe und mich frage ob eine Session Überprüfung dann nicht in einer dieser Funktionen stattfinden müsste anstelle eines ViewControllers.

    Bin schon gespannt was ihr mir empfehlen könnt :D
  • Die Frage ist ja auch, wie der Token verwendet wird. Ich kenne es z.B. so, dass dieser bei einem Request im HTTP Header gesetzt wird. Ist der Token abgelaufen, dann erhältst Du einen entsprechenden statusCode im NSHTTPURLResponse. Daraufhin musst Du dann mit dem User + Passwort einen neuen Token anfordern.

    Anstelle in applicationDidEnterBackground(_:) solltest Du lieber in applicationWillEnterForeground(_:) prüfen, ob der aktuelle Token noch gültig ist.
  • MCDan schrieb:

    Die Frage ist ja auch, wie der Token verwendet wird. Ich kenne es z.B. so, dass dieser bei einem Request im HTTP Header gesetzt wird. Ist der Token abgelaufen, dann erhältst Du einen entsprechenden statusCode im NSHTTPURLResponse. Daraufhin musst Du dann mit dem User + Passwort einen neuen Token anfordern.

    Anstelle in applicationDidEnterBackground(_:) solltest Du lieber in applicationWillEnterForeground(_:) prüfen, ob der aktuelle Token noch gültig ist.
    Speicher ich Session-Daten ebenfalls in einer dieser Funktionen oder mache ich das im entsprechenden ViewController ?

    Ich meine würde ja Sinn machen spezielle Daten immer mal wieder zu speichern wenn die App gerade im Hintergrund läuft oder dann halt geschlossen wird oder ?
  • Also ich habe jetzt mal einen Login geschrieben der soweit auch funktioniert. nur leider kriege ich immer eine etwas verwirrende Meldung in der Konsole und zwar:
    Warning: Attempt to present <LoginScreen.ViewController: 0x7fb37ad05600> on <LoginScreen.ProfileViewController: 0x7fb37ae0cf30> whose view is not in the window hierarchy!

    Wie gesagt, es funktioniert aber eigentlich alles genau so wie ich mir das vorstelle. Wieso sagt er mir dann das er Probleme mit dem View-Wechsel hat ?

    Hier dann noch mein Code (ViewController):

    Quellcode

    1. import UIKit
    2. class ViewController: UIViewController {
    3. @IBOutlet weak var userTextfield: UITextField!
    4. @IBOutlet weak var passwordTextfield: UITextField!
    5. @IBOutlet weak var loginButton: UIButton!
    6. var json: [String: Any]!
    7. let user = "baum@123.de"
    8. let pw = "123"
    9. let url = URL(string: "https://valapi.ceddassoft.de/v0.1/login.php")!
    10. var login_session:String = ""
    11. let defaults = UserDefaults.standard
    12. override func viewDidLoad() {
    13. super.viewDidLoad()
    14. if defaults.object(forKey: "token") != nil
    15. {
    16. login_session = defaults.object(forKey: "token") as! String
    17. checkSession()
    18. }
    19. else
    20. {
    21. LoginToDo()
    22. }
    23. }
    24. @IBAction func loginButtonTapped(_ sender: Any) {
    25. let test = "user=\(user)&password=\(pw)"
    26. var request = URLRequest(url: url)
    27. request.httpMethod = "POST"
    28. request.httpBody = test.data(using: String.Encoding.utf8)
    29. print(request.httpBody as Any)
    30. //create dataTask using the session object to send data to the server
    31. let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    32. guard let data = data else {return}
    33. do {
    34. //create json object from data
    35. self.json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
    36. print(self.json as Any)
    37. // handle json...
    38. if let parseJSON = self.json {
    39. let token = parseJSON["token"]
    40. let defaults = UserDefaults.standard
    41. defaults.set(token, forKey: "token")
    42. defaults.synchronize()
    43. print("fn=\(String(describing: token))")
    44. DispatchQueue.main.async(execute: self.loginDone)
    45. }
    46. } catch let error {
    47. print(error.localizedDescription)
    48. }
    49. })
    50. task.resume()
    51. }
    52. func loginDone(){
    53. if let destinationViewController = storyboard?.instantiateViewController(withIdentifier: "ProfileViewController") as? ProfileViewController {
    54. // Pass Data
    55. // Present Second View
    56. present(destinationViewController, animated: true, completion: nil)
    57. }
    58. }
    59. func LoginToDo()
    60. {
    61. userTextfield.isEnabled = true
    62. passwordTextfield.isEnabled = true
    63. loginButton.isEnabled = true
    64. }
    65. }
    Alles anzeigen


    Und der ProfileViewController ( Ist übrigens auch der Initial ViewController )

    Quellcode

    1. import UIKit
    2. class ProfileViewController: UIViewController {
    3. let defaults = UserDefaults.standard
    4. var login_session:String = ""
    5. override func viewDidLoad() {
    6. super.viewDidLoad()
    7. viewDidAppear(false)
    8. print("Hallo \(String(describing: defaults.object(forKey: "token") as? String))")
    9. }
    10. @IBAction func logoutButtonTapped(_ sender: Any) {
    11. let destinationViewController = storyboard?.instantiateViewController(withIdentifier: "Main") as? ViewController
    12. destinationViewController?.defaults.removeObject(forKey: "token")
    13. destinationViewController?.login_session.removeAll()
    14. present(destinationViewController!, animated: true, completion: nil)
    15. }
    16. override func viewDidAppear(_ animated: Bool) {
    17. if defaults.object(forKey: "token") != nil {
    18. login_session = defaults.object(forKey: "token") as! String
    19. } else {
    20. logoutButtonTapped((Any).self)
    21. }
    22. }
    23. }
    Alles anzeigen

    Was sagt ihr sonst so zum Code ? Ich will später noch Teile davon in die AppDelegate verfrachten. aber wollte das so alles erstmal testen :)