我的登录身份验证有问题

Posted

技术标签:

【中文标题】我的登录身份验证有问题【英文标题】:I'm having troubles with my Login authentication 【发布时间】:2017-07-13 15:08:46 【问题描述】:

我有一个 JSON Post 身份验证来发出登录请求,当然我需要发送用户和密码参数来接收填充我的 HomeViewController 的响应,所以我需要首先验证这两个参数,如果用户没有不存在当然我要发送警报并禁止访问主页。问题是我不知道我必须在哪种方法中进行此验证,因为我这样做的方式会在验证之前向我发出警报。这是我的代码:

class LoginViewController: UIViewController, LoginProtocol 

    @IBOutlet weak var username: UITextField!
    @IBOutlet weak var password: UITextField!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    var user : String = ""
    var psw : String = ""
    var idResponse : String = ""
    var message : String = ""
    override func viewDidLoad() 
        super.viewDidLoad()
    

    @IBAction func validateLogin(_ sender: Any) 
        DoLogin(self.username.text!, self.password.text!)
    

    @IBAction func login(_ sender: Any) 

        if self.idResponse != "0" 
            validation(message: self.message)
         else 
            let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
            self.present(vc, animated: false, completion: nil)
            vc.getUser = self.username.text!
            vc.getPassword = self.password.text!
        
    

    func validation(message: String) 
        let myAlert = UIAlertController(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert)
        let okAction = UIAlertAction (title: "Ok", style: UIAlertActionStyle.default, handler: nil)
        myAlert.addAction(okAction)
        self.present(myAlert, animated: true, completion: nil)
        return
    

func DoLogin(_ user:String, _ psw:String)
    
        let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url!)
        request.httpMethod = "POST"

        self.username.text = user
        self.password.text = psw

        let paramToSend = ["username":user,"password":psw]
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)

        let task = session.dataTask(with: request as URLRequest, completionHandler: 
            (data, response, error) in

            guard let _:Data = data else
            
                return
            

            let json:AnyObject?

            do 
                json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = json
                    let loginModel = LoginModel()

                    let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
                    loginModel.message = defaultServiceResponse["message"] as! String
                    loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int

                    self.idResponse = String(loginModel.idResponse)
                    self.message = loginModel.message

                    print(json!)

                
             catch 
                let error = ErrorModel()
                error.phrase = "PARSER_ERROR"
                error.code = -1
                error.desc = "Parser error in login action"
            
        )

        task.resume()
    

validateLogin 方法被附加到一个带有动作的 TextView:“EditingDidEnd”。所以我需要的是,当我写完密码时,DoLogin 函数会验证它的存在并让我继续使用 HomeViewController,但问题是当我单击按钮“Ingresar”(登录)时,它首先显示一个空白警报只有我第二次单击按钮时,它才让我立即通过。如果我之前没有调用它,我不知道为什么要发送我在“功能验证”中声明的警报。我将附上一张图片,向您展示正在出现的警报:

【问题讨论】:

您知道dataTask(with 是异步工作的吗? 何时验证?验证后你想调用登录​​吗? 与您想知道的无关,但仅供参考:如果用户未输入密码或用户名,此行 DoLogin(self.username.text!, self.password.text!) 将崩溃。所以最好安全地打开包装。见here 您必须实现一个完成处理程序才能获得通知。 SO上有数百个相关问题。 简短示例:***.com/questions/44131678/… 【参考方案1】:

当您按下登录按钮时,您的 EditingDidEnd 方法调用 DoLogin 可能会在后台处理。因此,当您的 idResponse 初始化为“”空字符串时,您的 if 条件变为真。

如果 self.idResponse != "0"

纠正此 if 条件以检查其是否为空,然后不要调用验证消息。

执行此操作的最佳方法是仅在单击登录按钮后调用 DoLogin,如果您成功重定向到主页。否则显示警报。请注意在主线程上执行 UI 操作。

【讨论】:

你能帮我看看 if 条件必须是怎样的吗?因为我是这样写的,但什么也没发生: if self.idResponse .isEmpty == true else if self.idResponse != "0" validation(message: self.message) else let vc = self.故事板!.instantiateViewController(withIdentifier: "home") as! HomeViewController self.present(vc,动画:false,完成:nil)vc.getUser = self.username.text! vc.getPassword = self.password.text! 正如您从 Vadian 的回答中得出的那样,一旦您在完成处理程序中添加此警报代码显示,您将不会遇到响应空问题,因此您不会看到空警报。在您的完成处理程序中,您可以拥有有效的响应条件以及无效的响应条件并相应地执行您的操作。成功和错误条件取决于您的验证服务将返回的响应。【参考方案2】:

先这样更新代码和用户

func DoLogin(_ user:String, _ psw:String)
    
        let url = URL(string: "http://162.209.99.39:8080/MiClaroBackend/auth")
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url!)
        request.httpMethod = "POST"


        let paramToSend = ["username":user,"password":psw]
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try! JSONSerialization.data(withJSONObject: paramToSend)

        let task = session.dataTask(with: request as URLRequest, completionHandler: 
            (data, response, error) in

            guard let _:Data = data else
            
                return
            

            let json:AnyObject?

            do 
                json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                if let parseJSON = json
                    let loginModel = LoginModel()

                    let defaultServiceResponse = parseJSON["defaultServiceResponse"] as! NSDictionary
                    loginModel.message = defaultServiceResponse["message"] as! String
                    loginModel.idResponse = defaultServiceResponse["idResponse"] as! Int

                    self.idResponse = String(loginModel.idResponse)
                    self.message = loginModel.message
 if self.idResponse != "0" 
            validation(message: self.message)
         else 
  let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController
            self.present(vc, animated: false, completion: nil)
            vc.getUser = user!
            vc.getPassword = psw!
        

                
             catch 
                let error = ErrorModel()
                error.phrase = "PARSER_ERROR"
                error.code = -1
                error.desc = "Parser error in login action"
            
        )

        task.resume()
    

【讨论】:

抱歉,这不起作用,因为要进行验证,首先需要在 TextView 上写入用户和密码,所以我不能将条件放在 JSON 序列化中。【参考方案3】:

如果您想在 imageview 中添加警报,请使用此代码

var imageView = UIImageView(frame: CGRectMake(220, 10, 40, 40))
imageView.image = yourImage

alert.view.addSubview(imageView)

【讨论】:

以上是关于我的登录身份验证有问题的主要内容,如果未能解决你的问题,请参考以下文章

在 OCUnit 应用程序测试中绕过登录/身份验证

使用登录名和密码或证书进行身份验证

成功登录后 SwiftUI Firebase 身份验证关闭视图

Laravel 默认登录身份验证生成意外错误

使用集成 Windows 身份验证接收登录提示

使用 Firebase 登录的 Loopback 4 身份验证