如何在Swift登录函数中配置Basic Authentication基础认证
在Swift的URLRequest中配置Basic Authentication的正确步骤
你之前的代码里差了关键的一步:Base64编码——Basic认证要求把name:password的明文字符串转换成Base64格式,而不是直接把明文放到请求头里。下面是具体的配置步骤,以及修正后的完整代码:
具体步骤
设置正确的HTTP请求方法
先确认后端接口要求的请求方法(你代码里注释了PUT,如果后端确实要求用PUT就保留,通常获取token的接口可能用POST或者GET,要和后端文档一致),比如:request.httpMethod = "PUT"对用户名密码进行Base64编码
把用户名和密码用冒号拼接成字符串,再转换成Base64编码:let credentials = "\(name):\(pass)" guard let credentialsData = credentials.data(using: .utf8) else { print("Failed to convert credentials to data") return } let base64Credentials = credentialsData.base64EncodedString()配置Authorization请求头
按照Basic <Base64编码字符串>的格式设置请求头,注意Basic后面必须有一个空格:request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
修正后的完整login()函数
func login() { guard let url = URL(string: "http://0.0.0.0:5000/v1/token") else { print("Invalid url") return } // 假设name和pass是你已经获取到的用户名和密码变量 guard let name = usernameTextField.text, !name.isEmpty, let pass = passwordTextField.text, !pass.isEmpty else { print("Username or password is empty") return } var request = URLRequest(url: url) request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 1. 设置请求方法 request.httpMethod = "PUT" // 2. 编码用户名密码 let credentials = "\(name):\(pass)" guard let credentialsData = credentials.data(using: .utf8) else { print("Failed to process credentials") return } let base64Credentials = credentialsData.base64EncodedString() // 3. 设置认证头 request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization") URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Fetch failed with error: \(error.localizedDescription)") return } guard let data = data else { print("No data received") return } do { let decodeResponse = try JSONDecoder().decode(Token.self, from: data) DispatchQueue.main.async { self.token = decodeResponse.token } } catch { print("Failed to decode response: \(error.localizedDescription)") } }.resume() // 别忘了调用resume()启动任务!你之前的代码漏了这个 }
额外注意点
- 一定要调用
resume()启动URLSession的数据任务,否则请求根本不会发送出去,这是新手很容易犯的错误。 - 生产环境必须使用HTTPS,否则Base64编码的内容可以被轻松解码,等于明文传输密码。
- 如果你的App需要处理多次认证请求,也可以考虑用
URLCredential配合URLSessionConfiguration来管理,但直接设置请求头是最直接的方式。
内容的提问来源于stack exchange,提问作者ccd
相关产品推荐
相关产品推荐

