You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:41