注销swift后令牌不会变空

时间:2018-05-31 20:50:33

标签: ios swift token django-rest-auth

我有一个使用API​​进行身份验证的快速应用程序一切正常,当用户注销时,登录令牌应该被清除,以便可以收集新用户的详细信息并将新令牌传递到标题但我注意到当我尝试在另一个用户登录时,之前的用户令牌仍然在标题中,从而阻止新用户登录。我清除登出按钮时的登录值,但我不知道为什么令牌值保留在标题中。我的代码如下所示

let defaults = UserDefaults.standard

var isLoggedIn : Bool {

    get {
        return defaults.bool(forKey: LOGGED_IN_KEY)
    }
    set {
        defaults.set(newValue, forKey: LOGGED_IN_KEY)
    }
}

var authToken: String {
    get {
        return defaults.value(forKey: TOKEN_KEY) as? String ?? ""
    }
    set {
        defaults.set(newValue, forKey: TOKEN_KEY)
    }
}

var userUsername: String {
    get {
        return defaults.value(forKey: USER_USERNAME) as? String ?? ""
    }
    set {
        defaults.set(newValue, forKey: USER_USERNAME)
    }
}
//MARK :- LOGGIN
func findUserByUserName(completion: @escaping CompletionHandler) -> Void {

    Alamofire.request(URL_USER_BY_USERNAME, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: TOKEN_HEADER).validate().responseJSON { (response) in

        print("URL USER BY HEADER \(self.authToken)")

        if response.result.error == nil {

            guard let data = response.data else {return}
            let jsonString = String(data: data, encoding: .utf8)
            print(jsonString as Any)
            self.setUserInfo(data: data)

            completion(true)
            }
         else {


            completion(false)
            debugPrint("ERROR 22222\(response.result.error as Any)")
        }
    }
}


func setUserInfo(data: Data) -> Void {
    do {
        let json = try JSON(data: data)
        let pk = json["pk"].intValue
        let username = json["username"].stringValue
        let email = json["email"].stringValue
        let firstName = json["first_name"].stringValue
        let lastName = json["last_nameme"].stringValue

        print("THE USERNAME IZZZZ \(username)")

        UserDataService.instance.setUserData(pk: pk, username: username, email: email, firstName: firstName, lastName: lastName)

    } catch {
        print(error)
    }

func loginUser(email: String, password: String, completion: @escaping CompletionHandler) -> Void {

    let usernameEmail = email.lowercased()

    let body: [String: Any] = [
        "username": usernameEmail,
        "email": "",
        "password": password,
    ]

    Alamofire.request(URL_LOGIN, method: .post, parameters: body, encoding: JSONEncoding.default, headers: HEADER).validate().responseJSON { (response) in

        if response.result.error == nil {
            print("LOGIN SUCCESFULL \(self.authToken)")

            do {


                guard let data = response.data else {return}
                let jsonString = String(data: data, encoding: .utf8)
                print("HELLOOO \(jsonString as Any)")
                let json = try JSON(data: data)
                self.authToken = json["key"].stringValue
                self.userUsername = email



                self.isLoggedIn = true

                completion(true)
                print("LOGIN SUCCESFULL TOKEN1111 \(self.authToken)")

            } catch {
                print("errorrrrr")
            }

        } else {
            completion(false)
            debugPrint("ERROR YENNNNN \(response.result.error as Any)")
        }
    }
}


//MARK :- LOGGIN
func findUserByEmail(completion: @escaping CompletionHandler) -> Void {

    let body: [String: Any] = [
        "username": AuthService.instance.userUsername,

        ]

    Alamofire.request(URL_USER_BY_EMAIL, method: .put, parameters: body, encoding: JSONEncoding.default, headers: TOKEN_HEADER).validate().responseJSON { (response) in

        print("URL USER BY HEADER \(self.authToken)")

        if response.result.error == nil {

            guard let data = response.data else {return}
            print("USERUSERNAME \(self.authToken)")
            let jsonString = String(data: data, encoding: .utf8)
            print(jsonString as Any)
            self.setUserInfo(data: data)

            completion(true)
            }
         else {


            completion(false)
            debugPrint("ERROR 22222\(response.result.error as Any)")
        }
    }
}

令牌常量

let TOKEN_HEADER = [
    "Authorization": "Token \(AuthService.instance.authToken)",
    "Content-Type": "application/json; charset=utf-8"
]

UserService

func setUserData(pk: Int, username: String, email: String, firstName: String, lastName: String) -> Void {

    self.pk = pk
    self.username = username
    self.email = email
    self.firstName = firstName
    self.lastName = lastName
}


func logoutUser() -> Void {
    self.pk = 0
    self.username = ""
    self.email = ""
    self.firstName = ""
    self.lastName = ""
    AuthService.instance.isLoggedIn = false
    AuthService.instance.authToken = ""
    AuthService.instance.userUsername = ""
}

注销

@IBAction func logoutPressed(_ sender: Any) {
        UserDataService.instance.logoutUser()
        print("LOGOUT TOKEN \(AuthService.instance.authToken)")
        UserDataService.instance.setUserData(pk: 0, username: "", email: "", firstName: "", lastName: "")
        AuthService.instance.authToken = ""
        NotificationCenter.default.post(name: NOTIFY_USER_DATA_DID_CHANGE, object: nil)

        dismiss(animated: true, completion: nil)
    }

将根据要求提供更多代码

1 个答案:

答案 0 :(得分:1)

问题在于,您认为每当您致电TOKEN_HEADER时,您都会从

获得最新值
 let TOKEN_HEADER = [
   "Authorization": "Token \(AuthService.instance.authToken)",
   "Content-Type": "application/json; charset=utf-8"
 ]

但是这不会发生,因为变量从第一次初始化获得它的值,无论令牌值是什么,所以你必须重构将头发送到Alamofire,通过再次硬编码字符串

func findUserByUserName(completion: @escaping CompletionHandler) -> Void {

   let updated_HEADER = [
   "Authorization": "Token \(AuthService.instance.authToken)",
   "Content-Type": "application/json; charset=utf-8"
  ]

    Alamofire.request(URL_USER_BY_USERNAME, 
    method: .get, parameters: nil, encoding: JSONEncoding.default,
    headers:updated_HEADER).validate().responseJSON { (response) in }

}