请求Twitter OAuth令牌时返回401未授权错误,求排查方案
问题修复方案
你的代码存在多处不符合OAuth 1.0a规范的问题,正是这些问题导致401错误,逐一修复即可:
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";签名生成时传入动态参数
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);统一编码格式
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))); } }签名密钥格式修正
请求令牌阶段token_secret为空,签名密钥必须是UrlEncode(consumer_secret)&,末尾的&是必填项,不能省略。
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

