2017-05-06 3 views
1

여기에 몇 가지 코드가 있습니다. 오류 401이 수신되고 있습니다. 지저귐 상자에 로그인을 확인했습니다.twitter unauthorized 401 C# oauth/request_token

public async Task get_Oauth_token_TaskAsync() 
    { 


     //variables for action 
     string oauth_nonce; 
     string oauth_callback; 
     string oauth_signature_method; 
     string oauth_timestamp; 
     string oauth_consumer_key; 
     string oauth_signature; 
     string oauth_version; 
     string req_url; 
     //set values to variables 
     var dt = DateTime.Now; 
     var ticks = dt.Ticks; 
     var seconds = ticks/TimeSpan.TicksPerSecond; 
     oauth_timestamp = seconds.ToString(); 
     oauth_callback = "http://www.localhost:55593/TwitterSync.aspx"; 
     oauth_nonce = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(0, 16).ToString(); //random string 
     oauth_signature_method = "HMAC-SHA1"; 
     oauth_consumer_key = "xxxx"; 
     oauth_version = "1.0"; 
     req_url = "https://api.twitter.com/oauth/request_token"; 
     oauth_signature = create_auth_Signature_Task(oauth_nonce,oauth_callback,oauth_signature_method,oauth_timestamp,oauth_consumer_key,oauth_version,req_url); 

     ///action 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(req_url); 
     request.Method = "POST"; 
     request.UserAgent = "themattharris' HTTP Client"; 
     request.Host = "api.twitter.com"; 

     request.Headers.Add(HttpRequestHeader.Authorization, "OAuth oauth_callback = \"" + Uri.EscapeDataString(oauth_callback) + "\"" + ",oauth_consumer_key = \"" + oauth_consumer_key + "\",oauth_nonce = " + "\"" + oauth_nonce + "\", oauth_signature = \"" + oauth_signature + "\", oauth_signature_method = \"HMAC-SHA1\", oauth_timestamp = \"" + oauth_timestamp + "\", oauth_version = \"1.0\""); 


     WebResponse response = await request.GetResponseAsync(); 
     Stream str = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(str); 
     dynamic resp = reader.ReadToEndAsync(); 

    } 

    private string create_auth_Signature_Task(string oauth_nonce, string oauth_callback, 
     string oauth_signature_method, string oauth_timestamp, string oauth_consumer_key, string oauth_version, string req_url) 
    { 
     string oauth_nonce_enc = Uri.EscapeDataString(oauth_nonce); 
     string oauth_callback_enc = Uri.EscapeDataString(oauth_callback); 
     string oauth_signature_method_enc = Uri.EscapeDataString(oauth_signature_method); 
     string oauth_timestamp_enc = Uri.EscapeDataString(oauth_timestamp); 
     string oauth_consumer_key_enc = Uri.EscapeDataString(oauth_consumer_key); 
     string oauth_version_enc = Uri.EscapeDataString(oauth_version); 
     string req_url_enc = Uri.EscapeDataString(req_url); 
     string secret = "xxxx"; 
     string signature_base = "POST&" + req_url_enc + "&" + Uri.EscapeDataString("oauth_consumer_key=" + oauth_consumer_key_enc + "&oauth_nonce=" + oauth_nonce + "&oauth_signature_method=" + oauth_signature_method_enc + "&oauth_timestamp=" + oauth_timestamp_enc + "&oauth_version=" + oauth_version_enc); 


     return ShaHash(signature_base, secret); 
    } 

    private string ShaHash(string value, string key) 
    { 
     using (var hmac = new HMACSHA1(Encoding.UTF32.GetBytes(key))) 
     { 
      return ByteToString(hmac.ComputeHash(Encoding.UTF32.GetBytes(value))); 
     } 
    } 

    static string ByteToString(IEnumerable<byte> data) 
    { 
     return string.Concat(data.Select(b => b.ToString("x2"))); 
    } 

나는 page에 따라 모든 작업을 수행했습니다. 지금은 그냥 잃어버린거야, 어떤 아이디어가 효과가 없지?

답변

2

oauth_timestamp가 올바르게 계산되지 않았습니다. 이는 1 00:00:00 (UTC)부터

int unixTimestamp = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; 

또는 .NET 또한

long unixTimestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); 

4.6 사용되는 서명 키를 사용하여 얀 1970 초이다 유닉스 시간으로 계산되어야 서명 생성은 인코딩 된 소비자 암호 백분율과 인코딩 된 토큰 비밀 백분율을 앰퍼샌드 (&)로 결합하여 연결해야합니다. 요청 토큰을 얻는 경우 토큰 비밀은 아직 알려지지 않으므로 앰퍼샌드 (&) 뒤에 소비자 비밀을 사용해야합니다. 함수가된다, 그래서 당신은 당신의 해시를 계산 한 후

var signingKey = oauth_consumer_key_enc + "&"; 

마지막으로 당신은 Base64로 인코딩 된 문자열을 반환해야합니다 :

private string ShaHash(string value, string signingKey) 
{ 
    using (var hmac = new HMACSHA1(Encoding.ASCII.GetBytes(signingKey))) 
    { 
    return Convert.ToBase64String(hmac.ComputeHash(Encoding.ASCII.GetBytes(value))); 
    } 
}