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

请求Twitter OAuth令牌时返回401未授权错误,求排查方案

问题修复方案

你的代码存在多处不符合OAuth 1.0a规范的问题,正是这些问题导致401错误,逐一修复即可:

  1. Authorization头使用动态参数而非硬编码值
    构建auth字符串时,必须使用前面生成的oauth_nonce、oauth_signature、oauth_timestamp变量,同时所有参数值需要UrlEncode:

    var auth = "OAuth oauth_callback=" + Uri.EscapeDataString("你的回调URL");
    auth += $",oauth_consumer_key={Uri.EscapeDataString(_twitterConfig.consumer_key)}";
    auth += $",oauth_nonce={Uri.EscapeDataString(oauth_nonce)}";
    auth += $",oauth_signature={Uri.EscapeDataString(oauth_signature)}";
    auth += ",oauth_signature_method=HMAC-SHA1";
    auth += $",oauth_timestamp={oauth_timestamp}";
    auth += ",oauth_version=1.0";
    
  2. 签名生成时传入动态参数
    create_auth_Signature_Task需要接收oauth_nonce和oauth_timestamp作为参数,替换硬编码的固定值,同时保证回调URL与请求中的完全一致:

    // 修改方法签名,接收动态参数
    private string create_auth_Signature_Task(string oauth_nonce, string oauth_timestamp)
    {
        var callbackUrl = "你的回调URL";
        var finalStr = $"oauth_callback={Uri.EscapeDataString(callbackUrl)}";
        finalStr += $"&oauth_consumer_key={Uri.EscapeDataString(_twitterConfig.consumer_key)}";
        finalStr += $"&oauth_nonce={Uri.EscapeDataString(oauth_nonce)}";
        finalStr += "&oauth_signature_method=HMAC-SHA1";
        finalStr += $"&oauth_timestamp={oauth_timestamp}";
        finalStr += "&oauth_version=1.0";
    
        finalStr = Uri.EscapeDataString(finalStr); // 用Uri.EscapeDataString更符合OAuth标准
    
        var signatureBaseString = $"POST&{Uri.EscapeDataString(_twitterConfig.request_token_url)}&{finalStr}";
        var signatureKey = $"{Uri.EscapeDataString(_twitterConfig.consumer_secret)}&"; // 注意末尾的&不能省略
        
        return ShaHash(signatureBaseString, signatureKey);
    }
    
    // 调用时传入参数
    oauth_signature = create_auth_Signature_Task(oauth_nonce, oauth_timestamp);
    
  3. 统一编码格式
    ShaHash方法中密钥和签名基字符串的编码必须统一为UTF-8(OAuth标准要求):

    private string ShaHash(string value, string key)
    {
        using (var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(key)))
        {
            return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(value)));
        }
    }
    
  4. 签名密钥格式修正
    请求令牌阶段token_secret为空,签名密钥必须是UrlEncode(consumer_secret)&,末尾的&是必填项,不能省略。

内容的提问来源于stack exchange,提问作者Pankaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:50:23