iOS应用HTTP POST请求中含€符号的密码登录失败问题排查
iOS登录密码含€符号失败的排查与解决
核心问题分析
你遇到的问题核心在于Basic认证头的字符编码与服务器预期不匹配。虽然你已经确认了app端的UTF-8编码、Base64转换都正确,但网页端与app端对特殊字符(如€)的编码处理存在差异,导致服务器无法识别app发送的认证信息。
具体排查与修复步骤
1. 尝试切换Basic认证的字符编码
HTTP标准中Basic认证默认使用ISO-8859-1(Latin-1)编码,而你的代码用的是UTF-8。€符号在两种编码中的字节完全不同:
- UTF-8中€是3字节:
0xE2 0x82 0xAC - ISO-8859-1中€是1字节:
0xA4
如果服务器仅兼容ISO-8859-1编码的Basic认证,就会导致密码验证失败。修改getURLRequest中的编码方式试试:
static func getURLRequest(str: String, method: String) -> URLRequest { let url = URL(string: str)! var request = URLRequest(url: url) let loginString = "\(Helper.loggedOnUserWithDomain):\(Helper.loggedOnUserPassword)" // 优先使用ISO-8859-1编码,兼容则回退UTF-8 let loginData = loginString.data(using: .isoLatin1) ?? loginString.data(using: .utf8)! let base64LoginString = loginData.base64EncodedString() request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") request.httpMethod = method request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type") return request }
2. 对比网页端与app端的认证头
用Charles/Fiddler抓包工具分别获取网页端和app端的登录请求,对比两者的Authorization头:
- 将Base64字符串解码,查看€符号对应的字节序列
- 如果网页端的解码字节是
0xA4(ISO-8859-1),而app端是0xE2 0x82 0xAC(UTF-8),则说明服务器只认ISO-8859-1编码的认证信息。
3. 确认服务器的认证逻辑
虽然网页端正常,但浏览器可能自动对表单提交的密码做了编码转换(比如将UTF-8转成ISO-8859-1),而app直接发送UTF-8编码的Basic头就会不兼容。可以联系后端同学确认服务器对Basic认证的编码要求,或者是否对网页端请求有特殊的编码处理逻辑。
额外注意
你代码中SignOn函数里的httpBody传的是空密码(p: ""),但实际登录用的是Basic认证头,这部分逻辑没问题,但如果服务器同时依赖请求体的密码字段,那也需要确保请求体中的密码编码与网页端一致。
内容的提问来源于stack exchange,提问作者Fryndorfer
相关产品推荐
相关产品推荐

