Токен аутентификации сеанса Swift - PullRequest
0 голосов
/ 07 мая 2018

Я относительно новичок в интеграции API в Swift. У меня есть страница входа в систему, и я пытаюсь аутентифицировать пользователя и создать сеанс, когда он входит в систему. Я нашел код в Интернете, который предположительно работает для многих людей, но у меня возникают проблемы с тем, чтобы заставить все это работать. Я пришел к выводу, что что-то идет не так, начиная с этой строки, которую вы увидите в приведенном ниже коде, потому что в строке перед ней я могу получить токен аутентификации.

if let data_block = server_response["accessToken"] as? NSDictionary

Я включил весь соответствующий код, и мне хотелось бы знать, что происходит не так, как успешно аутентифицировать и создать сеанс, и добиться того, чтобы переход действительно работал.

 override func viewDidLoad() {
    super.viewDidLoad()

    _login_button = "Login"

    let preferences = UserDefaults.standard

    if(preferences.object(forKey: "session") != nil)
    {
        LoginDone()
    }
    else
    {
        LoginToDo()
    }

}


@IBAction func signIn() {


    let username = emailLoginTextField.text
    let password = passwordLoginTextField.text

    if(username == "" || password == "")
    {
        return
    }

    if(_login_button == "Logout")
    {
        let preferences = UserDefaults.standard
        preferences.removeObject(forKey: "session")

        LoginToDo()
        return
    } else {
        DoLogin(username!, password!)
    }    
}

func DoLogin(_ user:String, _ psw:String)
{
    let url = URL(string: "http://agile-castle-10059.herokuapp.com/authentication")
    let session = URLSession.shared

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

    let paramToSend = "username=" + user + "&password=" + psw + "&strategy=" + "local"

    request.httpBody = paramToSend.data(using: String.Encoding.utf8)


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

        guard let _:Data = data else
        {
            return
        }

        let json:Any?

        do
        {
            json = try JSONSerialization.jsonObject(with: data!, options: [])
        }
        catch
        {
            return
        }


        guard let server_response = json as? NSDictionary else
        {

            return
        }

//problem occurs around here, nothing happens (assuming the data_block isn't being created for some reason)

        if let data_block = server_response["data"] as? NSDictionary
        {
            if let session_data = data_block["session"] as? String
            {
                let preferences = UserDefaults.standard
                preferences.set(session_data, forKey: "session")

                DispatchQueue.main.async (
                    execute:self.LoginDone
                )
            }
        }

    })

    task.resume()

}


func LoginToDo()
{
    _login_button = "Login"
}

func LoginDone()
{
     self.shouldPerformSegue(withIdentifier: "showHomeViewControllerFromSignIn", sender: self)
    _login_button = "Logout"
}

1 Ответ

0 голосов
/ 07 мая 2018

Я исправил несколько вещей и понял это

 guard let server_response = json as? NSDictionary else
        {
            return
        }


            if let session_data = server_response["accessToken"] as? String
            {
                let preferences = UserDefaults.standard
                preferences.set(session_data, forKey: "accessToken")

                DispatchQueue.main.async (
                    execute:self.LoginDone
                )
            }


    })

    task.resume()

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...