login - usuario - ¿Cómo hacer una solicitud de publicación HTTP con un cuerpo específico? ¿Y cómo acceder al token desde el servidor para permitirme iniciar sesión?
sistema de login php (1)
Tiene problemas para codificar el nombre de usuario y la contraseña en bodyStr
actualizarlo a
self.bodyStr = "username=" + actualUsername + "&password=" + actualPassword + "&grant_type=password"
Actualice las declaraciones dentro de do
con
do {
let tokenDictionary:NSDictionary = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! NSDictionary
print(tokenDictionary)
// Get the token
if let authToken = tokenDictionary["access_token"] as? String{
self.token = authToken
UserDefaults.standard.set(accessToken, forKey: "access_token")
UserDefaults.standard.synchronize()
DispatchQueue.main.async {
self.dismiss(animated: true, completion: nil)
}
}
}
Puede implementar una función como isUserLoggedIn que devolverá true si token se guarda en userDefaults. Debes comprobar si el usuario ha iniciado sesión en la applicationdidFinishLaunchingWithOptions
Dealer AppleidFinishLaunchingWithOptions .Like
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if isUserLoggedIn(){
//showHomeViewController
} else{
//showLoginViewController
}
return true
}
func isUserLoggedIn() -> Bool{
if let accessToken = UserDefaults.standard.object(forKey: "access_token") as? String {
if (accessToken.characters.count)! > 0{
return true
} else {
return false
}
}
else {
return false
}
}
Estoy teniendo un escenario como:
1) Quiero crear la solicitud Http POST y para esto estoy teniendo los datos, por favor mira esta imagen:
2) Como puede ver en la imagen de arriba, tengo que crear una solicitud con el cuerpo mencionado y también recibo una respuesta llamada token. ¿Cómo crear una solicitud posterior y obtener esta respuesta del token ?.
3) Esa respuesta simbólica me permitirá iniciar sesión en myapp.
Soy novato en este escenario. He intentado un poco de código por mi cuenta, pero sigo confundiéndome en cómo combinar mi código de delegado de aplicación con este Código de solicitud de POST.
Código
@IBAction func signinaction(_ sender: Any) {
self.username.resignFirstResponder()
self.password.resignFirstResponder()
if (self.username.text == "" || self.password.text == "") {
let alertView = UIAlertController(title: "Login failed",
message: "Wrong username or password." as String, preferredStyle:.alert)
let okAction = UIAlertAction(title: "Try Again!", style: .default, handler: nil)
alertView.addAction(okAction)
self.present(alertView, animated: true, completion: nil)
return
}
// Check if the user entered an email
if let actualUsername = self.username.text {
// Check if the user entered a password
if let actualPassword = self.password.text {
// Build the body message to request the token to the web app
self.bodyStr = "username=8870417698&password=1234&grant_type=password" + actualUsername + "&password=" + actualPassword
// Setup the request
let myURL = NSURL(string: "http://ezschoolportalapi.azurewebsites.net/token")!
let request = NSMutableURLRequest(url: myURL as URL)
request.httpMethod = "POST"
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.httpBody = bodyStr.data(using: String.Encoding.utf8)!
let task = URLSession.shared.dataTask(with: request as URLRequest) {
(data, response, error) -> Void in
if data?.count != 0
{
do {
let tokenDictionary:NSDictionary = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! NSDictionary
print(tokenDictionary)
// Get the token
let token:String = tokenDictionary["access_token"] as! String
// Keep record of the token
let userdefaults = UserDefaults()
let saveToken = userdefaults.set(token, forKey: "access_token")
userdefaults.synchronize()
// Dismiss login view and go to the home view controller
DispatchQueue.main.async {
self.dismiss(animated: true, completion: nil)
}
}
catch {
// Wrong credentials
// Reset the text fields
self.username.text = ""
self.password.text = ""
// Setup the alert
let alertView = UIAlertController(title: "Login failed",
message: "Wrong username or password." as String, preferredStyle:.alert)
let okAction = UIAlertAction(title: "Try Again!", style:.default, handler: nil)
alertView.addAction(okAction)
self.present(alertView, animated: true, completion: nil)
return
}
}
}
task.resume()
}
}
}
La pregunta es cómo combinar este código con mi código anterior:
let appDelegate = UIApplication.shared.delegate as! AppDelegate appDelegate.gotoMainvc()
si utilizo este código directamente, en cualquiera de los casos puedo cambiar a la pantalla de inicio, no importa si estoy usando este código de solicitud POST o no. Por favor ayuda.