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

使用libcurl调用Google Android API登录遇403 BadAuthentication错误

调试Google Keep登录请求403 BadAuthentication问题的建议
  • 抓包对比TLS握手细节
    用Wireshark或tcpdump分别捕获Python gkeepapi和你的C程序的登录请求,重点对比TLS握手阶段的以下内容:

    • 协商的加密套件(比如Python可能用TLS_AES_256_GCM_SHA384,而libcurl默认套件不同)
    • TLS扩展字段:ALPN(是否启用HTTP/2)、SNI、EC曲线(Google偏好特定的椭圆曲线如secp256r1)
      这些差异可能导致Google服务拒绝你的请求,即使OpenSSL版本一致。
  • 对齐libcurl与Python的TLS配置

    • 复制Python使用的加密套件:在Python中执行import ssl; print(ssl.get_ciphers())查看默认套件,然后在libcurl中通过CURLOPT_SSL_CIPHER_LIST设置相同的套件字符串。
    • 强制启用SNI:显式设置curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_SNI, 1L)(部分环境下libcurl默认未开启)。
    • 启用HTTP/2:如果Python请求用了HTTP/2,确保libcurl编译时包含nghttp2支持,然后设置curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS)。
  • 完全复刻请求头
    BadAuthentication不一定是签名问题,可能是请求头缺失或不一致。对比Python和C程序的所有请求头:

    • User-Agent:gpsoauth可能用了特定的UA字符串,比如gkeepapi/0.14.0,libcurl默认UA是curl/[版本号],必须完全一致。
    • Google特定头:比如X-Goog-AuthUser、X-Goog-Request-Id等,gpsoauth可能自动添加这些头,检查是否遗漏。
      可以在Python中启用请求调试(比如用requests.Session()打印请求头),在libcurl中用CURLOPT_HTTPHEADER逐个添加匹配的头。
  • 字节级对比请求体
    确保请求体的编码、格式完全一致:

    • 检查URL编码:比如参数中的特殊字符是否被正确编码,Python的urllib.parse.urlencode和libcurl的curl_easy_escape是否有差异。
    • 换行符与空白:请求体中的换行是\n还是\r\n,是否有多余的空白字符。
    • 转成十六进制对比:把Python生成的请求体和libcurl发送的请求体转成十六进制字符串,逐字节检查差异。
  • 验证OAuth签名生成逻辑
    gpsoauth的核心是Google OAuth的签名生成,重点检查C代码中的以下部分:

    • 时间戳(timestamp)和随机数(nonce)的生成是否和Python一致(比如是否用了相同的时间格式、随机数长度)。
    • HMAC哈希算法的实现:比如HMAC-SHA1的字节顺序、输出编码(是否是Base64或十六进制,是否有大小写差异)。
      直接对比Python生成的签名和C代码生成的签名,确保完全相同。
  • 启用libcurl详细调试日志
    开启libcurl的 verbose 模式,捕获所有请求细节:

    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    // 可选:自定义调试函数捕获更详细的输出
    int debug_callback(CURL *curl, curl_infotype type, char *data, size_t size, void *userptr) {
        fprintf(stderr, "[%d] %.*s\n", type, (int)size, data);
        return 0;
    }
    curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, debug_callback);
    

    对比日志中TLS协商过程、发送的请求头和体,和Python的请求日志逐一核对。

  • 临时排查证书验证问题
    虽然403错误指向认证问题,但可以临时关闭证书验证测试是否是证书路径问题:

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    

    如果请求成功,说明libcurl的证书存储路径与Python不同,需要配置CURLOPT_CAINFO指向正确的CA证书文件。

内容的提问来源于stack exchange,提问作者Sergey S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:53