2014-05-13 3 views
0

트위터에 로그인 할 기능을 제공하고 싶습니다. &으로 게시하십시오. Windows 8.1 Universal app에서 트윗을 게시하십시오. 타사 라이브러리로 이동하라고 제안하지 마십시오. 나는 단지 두 가지 일을하고 싶다. 내 노력은 아래와 같습니다. 나는 나의 인증이 틀렸다는 것을 의심한다. 나는 얻고있다 System.Net.WebException => 원격 서버가 오류를 반환했습니다 : (401) Unauthorized. 내 코드가 잘못된 이유는 무엇입니까?401 유니버설 앱에서 트위터에 상태를 게시하는 동안 Unauthorized (WebException)

public const string TwitterClientID = "XXXXXXXXXXXL3nZGhtKURASXg"; 
public const string TwitterClientSecret = "5HBuM1FVXXXXXXXXXXXXXXqaSm1awtNSes"; 
public const string TwitterCallbackUrl = "http://f.com"; 
public const string TweetFromAPI = "Tweeting from API"; 

String Oauth_token = null; 
String Oauth_token_secret = null; 

private async Task TwitterLogin() 
{ 
    TimeSpan SinceEpoch = (DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime()); 
    Random Rand = new Random(); 
    String TwitterUrl = "https://api.twitter.com/oauth/request_token"; 
    Int32 Nonce = Rand.Next(1000000000); 

    String SigBaseStringParams = "oauth_callback=" + Uri.EscapeDataString(TwitterCallbackUrl); 
    SigBaseStringParams += "&" + "oauth_consumer_key=" + TwitterClientID; 
    SigBaseStringParams += "&" + "oauth_nonce=" + Nonce.ToString(); 
    SigBaseStringParams += "&" + "oauth_signature_method=HMAC-SHA1"; 
    SigBaseStringParams += "&" + "oauth_timestamp=" + Math.Round(SinceEpoch.TotalSeconds); 
    SigBaseStringParams += "&" + "oauth_version=1.0"; 
    String SigBaseString = "POST&"; 
    SigBaseString += Uri.EscapeDataString(TwitterUrl) + "&" + Uri.EscapeDataString(SigBaseStringParams); 

    IBuffer KeyMaterial = CryptographicBuffer.ConvertStringToBinary(TwitterClientSecret + "&", BinaryStringEncoding.Utf8); 
    MacAlgorithmProvider HmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1"); 
    CryptographicKey MacKey = HmacSha1Provider.CreateKey(KeyMaterial); 
    IBuffer DataToBeSigned = CryptographicBuffer.ConvertStringToBinary(SigBaseString, BinaryStringEncoding.Utf8); 
    IBuffer SignatureBuffer = CryptographicEngine.Sign(MacKey, DataToBeSigned); 
    String Signature = CryptographicBuffer.EncodeToBase64String(SignatureBuffer); 
    String DataToPost = "OAuth oauth_callback=\"" + Uri.EscapeDataString(TwitterCallbackUrl) + "\", oauth_consumer_key=\"" + TwitterClientID + "\", oauth_nonce=\"" + Nonce.ToString() + "\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"" + Math.Round(SinceEpoch.TotalSeconds) + "\", oauth_version=\"1.0\", oauth_signature=\"" + Uri.EscapeDataString(Signature) + "\""; 

    var m_PostResponse = await PostData(TwitterUrl, DataToPost, false); 

    if (m_PostResponse != null) 
    { 

     String[] keyValPairs = m_PostResponse.Split('&'); 

     for (int i = 0; i < keyValPairs.Length; i++) 
     { 
      String[] splits = keyValPairs[i].Split('='); 
      switch (splits[0]) 
      { 
       case "oauth_token": 
        Oauth_token = splits[1]; 
        break; 
       case "oauth_token_secret": 
        Oauth_token_secret = splits[1]; 
        break; 
      } 
     } 

     if (Oauth_token != null) 
     { 

      TwitterUrl = "https://api.twitter.com/oauth/authorize?oauth_token=" + Oauth_token; 
      System.Uri StartUri = new Uri(TwitterUrl); 
      System.Uri EndUri = new Uri(TwitterCallbackUrl); 



      WebAuthenticationResult WebAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(
                WebAuthenticationOptions.None, 
                StartUri, 
                EndUri); 
      if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.Success) 
      { 
       var text = WebAuthenticationResult.ResponseData.Split(new char[] { '?' })[1]; 

       var dict = text.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries) 
        .Select(part => part.Split('=')) 
        .ToDictionary(split => split[0], split => split[1]); 

       //Oauth_token = dict["oauth_token"]; 
       //Oauth_token_secret = dict["oauth_verifier"]; 

       await PostTweet(); 
      } 
      else if (WebAuthenticationResult.ResponseStatus == WebAuthenticationStatus.ErrorHttp) 
      { 
      } 
      else 
      { 
      } 
     } 
    } 
} 

private async Task<String> PostData(String Url, String Data, bool flag) 
{ 
    string m_PostResponse = null; 
    try 
    { 
     HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(Url); 
     Request.Method = "POST"; 
     if (flag) 
     { 
      Request.ContentType = "application/x-www-form-urlencoded"; 
     } 
     Request.Headers["Authorization"] = Data; 
     if (flag) 
     { 
      using (Stream stream = await Request.GetRequestStreamAsync()) 
      { 
       var postBody = "status=" + Uri.EscapeDataString(TweetFromAPI); 
       byte[] content = System.Text.Encoding.UTF8.GetBytes(postBody); 
       stream.Write(content, 0, content.Length); 
      } 
     } 
     HttpWebResponse Response = (HttpWebResponse)await Request.GetResponseAsync(); 
     StreamReader ResponseDataStream = new StreamReader(Response.GetResponseStream()); 
     m_PostResponse = await ResponseDataStream.ReadToEndAsync(); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 

    return m_PostResponse; 
} 

public async Task PostTweet() 
{ 
    Random Rand = new Random(); 
    Int32 Nonce = Rand.Next(1000000000); 
    string status = TweetFromAPI; 
    string postBody = "status=" + Uri.EscapeDataString(status); 
    string oauth_consumer_key = TwitterClientID; 
    string oauth_consumerSecret = TwitterClientSecret; 
    string oauth_signature_method = "HMAC-SHA1"; 
    string oauth_version = "1.0"; 
    string oauth_token = Oauth_token; 
    string oauth_token_secret = Oauth_token_secret; 
    string oauth_nonce = Nonce.ToString(); 
    TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); 
    string oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString(); 

    SortedDictionary<string, string> basestringParameters = new SortedDictionary<string, string>(); 
    basestringParameters.Add("status", Uri.EscapeDataString(status)); 
    basestringParameters.Add("oauth_version", oauth_version); 
    basestringParameters.Add("oauth_consumer_key", oauth_consumer_key); 
    basestringParameters.Add("oauth_nonce", oauth_nonce); 
    basestringParameters.Add("oauth_signature_method", oauth_signature_method); 
    basestringParameters.Add("oauth_timestamp", oauth_timestamp); 
    basestringParameters.Add("oauth_token", oauth_token); 

    //Build the signature string 
    string baseString = String.Empty; 
    baseString += "POST" + "&"; 
    baseString += Uri.EscapeDataString("https://api.twitter.com/1.1/statuses/update.json") + "&"; 
    foreach (KeyValuePair<string, string> entry in basestringParameters) 
    { 
     baseString += Uri.EscapeDataString(entry.Key + "=" + entry.Value + "&"); 
    } 

    baseString = baseString.Substring(0, baseString.Length - 3); 

    //Build the signing key  
    string signingKey = Uri.EscapeDataString(oauth_consumerSecret) + 
     "&" + Uri.EscapeDataString(oauth_token_secret); 

    IBuffer KeyMaterial = CryptographicBuffer.ConvertStringToBinary(TwitterClientSecret + "&", BinaryStringEncoding.Utf8); 
    MacAlgorithmProvider HmacSha1Provider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1"); 
    CryptographicKey MacKey = HmacSha1Provider.CreateKey(KeyMaterial); 
    IBuffer DataToBeSigned = CryptographicBuffer.ConvertStringToBinary(signingKey, BinaryStringEncoding.Utf8); 
    IBuffer SignatureBuffer = CryptographicEngine.Sign(MacKey, DataToBeSigned); 
    String signatureString = CryptographicBuffer.EncodeToBase64String(SignatureBuffer); 

    string authorizationHeaderParams = String.Empty; 
    authorizationHeaderParams += "OAuth "; 
    authorizationHeaderParams += "oauth_nonce=" + "\"" + 
     Nonce.ToString() + "\","; 
    authorizationHeaderParams += "oauth_signature_method=" + 
     "\"" + Uri.EscapeDataString(oauth_signature_method) + "\","; 
    authorizationHeaderParams += "oauth_timestamp=" + "\"" + 
     Uri.EscapeDataString(oauth_timestamp) + "\","; 
    authorizationHeaderParams += "oauth_consumer_key=" + "\"" + 
     Uri.EscapeDataString(oauth_consumer_key) + "\","; 
    authorizationHeaderParams += "oauth_token=" + "\"" + 
     Uri.EscapeDataString(oauth_token) + "\","; 
    authorizationHeaderParams += "oauth_signature=" + "\"" + 
     Uri.EscapeDataString(signatureString) + "\","; 
    authorizationHeaderParams += "oauth_version=" + "\"" + 
     Uri.EscapeDataString(oauth_version) + "\""; 

    var respo = await PostData("https://api.twitter.com/1.1/statuses/update.json", authorizationHeaderParams, true); 
} 

답변

0

당신이 당신의 콜백 URL http://f.com 찾을 않았다 있었습니까?

, 나는 그런

var oWebBroker = Windows.Security.Authentification.Web.WebAuthenticationBroker; 
var endURI = oWebBroker.getCurrentApplicationCallbackUri().absoluteUri; 

... 

oWebBroker.authenticateAndContinue(startURI, endURI); 

같은 것을 사용하고 포 스퀘어에 연결하려면 제공되는 endURI이 MS-응용 프로그램 같은 것입니다 : // S-1-15-2-26 ... 33520119519/

크리스토프

+0

나는 단지 일시적으로 설정'에 http : // f.com' TwitterCallbackUrl''로. 나는 작동하지 않는'http : // google.com'을 시도했다. 나는 또한 당신의 해결책을 시도했다. 내 코드를 시험해보고 잘못된 점을 찾아달라고 요청합니다. – Xyroid