Токен не становится пустым после выхода из системы - PullRequest
0 голосов
/ 31 мая 2018

У меня есть быстрое приложение, которое использует 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 голосов
/ 01 июня 2018

Проблема в том, что вы думаете, что всякий раз, когда вы вызываете 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 }

}
...