2017-08-15 3 views
0

So mache ich eine Login-Anwendung, die Benutzername und Passwort sendet, und der Server antwortet mit Access-Token .... versuche, dieses Token für die spätere Verwendung zu speichern, aber ich kann wirklich nicht. hier ist mein Code, und die Antwort des Servers einhüllen Sie müssen es ImportSo verwenden Sie Zugriffstoken von Antwort mit swift 3

UIKit
class ViewController: UIViewController { 

    @IBOutlet weak var PhoneNumber: UITextField! 

    @IBOutlet weak var Password: UITextField! 
    //***************************************LogIn**********************************************\\ 
    @IBAction func Login(_ sender: UIButton) { 

     guard let url = URL(string: "https://goollyapp.azurewebsites.net/Token") else {return} 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     let postString = "username=" + PhoneNumber.text! + "&password="+Password.text!+"&grant_type=password" 
     print(postString) 
     request.httpBody = postString.data(using: .utf8) 
     let task = URLSession.shared.dataTask(with: request) { data, response, error in 
      if let response = response { 
       print(response) 
      } 
     } 
     task.resume() 
    } 
} 
+0

Was Ihr Backend ist? Haben Sie versucht, es einfach in den Antworttext anstelle des Headers zurückzugeben? – murphguy

+2

Ich würde kein Token öffentlich machen, und ja, das sieht aus wie ein Token ... es sollte in Ihrem Antwortobjekt sein, ich kenne Ihr Backend nicht, aber wie @murphguy sagte, wäre es besser, a zurückzugeben JSON-Objekt, das Ihre Tokendaten enthält, anstatt sie in der Kopfzeile zurückzugeben –

+0

Sie können das JSON-Token in ein Dictionary konvertieren und es dann mithilfe eines Schlüsselwertpaars verwenden. Später kann es als Singleton für mehrere VC erstellt werden. –

Antwort

1

Wo Sie die json Variable deklarieren ersetzen mit:

let json = try? JSONSerialization.jsonObject(with: data, options: []) as! [String: Any] 

Dann können Sie das Token Zugriff mit:

let token = json["access_token"] as! String 

(nach Erhalt einer erfolgreichen JSON-Antwort)

Sie können dann ein Singleton implementieren wie folgt:

class Token { 

    // Can't init a singleton 
    private init() { } 

    static let sharedInstance = Token() 

    var tokenString = "" 

} 
+0

bekomme einen Fehler bei der Verwendung von: let token = json ["access_token"] as! String –

+0

Fehler ist: Typ "Any?" hat keine tiefgestellten Mitglieder –

+1

Replace 'let json = versuchen? JSONSerialization.jsonObject (mit: data, options: []) ', mit' let json = versuchen? JSONSerialization.jsonObject (mit: data, options: []) as! [String: Beliebige] '. –

0

Wenn Sie das Token in einer Variablen speichern möchten es später verwenden, versuchen Sie diese (Schlüssel ist, um die entsprechenden Namen des Schlüssels in Ihrer Antwort-Objekt)

let token = httpResponse?.allHeaderFields["SECURITY-TOKEN"] as? String

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
      let httpResponse = response as? HTTPURLResponse 
      let token = httpResponse?.allHeaderFields["SECURITY-TOKEN"] as? String 
       print(token) 
} 
task.resume() 
+0

hmmmm ... scheint nicht zu funktionieren .... wenn ich es drucke ich bekomme keine –

+0

sowieso dieser Weg ist tatsächlich arbeiten ....: Lassen Sie Aufgabe = URLSession.shared.dataTask (mit: Anfrage) {Daten, Antwort , Fehler in Lassen Sie Json = versuchen? JSONSerialization.jsonObject (mit: data !, Optionen: []) as! [String: Beliebige] Lassen Sie Token = Json? ["Access_Token"] als!String Drucken (Token) } task.resume() // Das einzige Problem ist, dass ich dieses Token aus einer anderen Klasse verwenden möchte @Naishta –

+0

wie über das Erstellen eines Objekts dieser Klasse und den Zugriff auf diese Token-Eigenschaft ? oder ein anderer Ansatz, der diese Eigenschaft dorthin bringt, wo Sie sie auch immer brauchen – Naishta

Verwandte Themen