2011-08-24 3 views
0

WCF REST API 통합 작업 중입니다. 또한 Twitter API로 작업 한 것은 이번이 처음입니다. 내가 콘솔 애플 리케이션에서 이러한 라인을 코딩. 내가 "난"LS 친구 "를 선택하면"LS 공개 "는 대중의 XML datam을 표시하지만 선택하거나 경우 Twitter Doc 여기Twitter 승인을위한 WCF REST

HttpClient http = new HttpClient("http://twitter.com/statuses/"); 
http.TransportSettings.Credentials = new NetworkCredential(username, password); 
HttpResponseMessage resp = null; 
System.Net.ServicePointManager.Expect100Continue = false; 

Console.WriteLine("\nPlease enter a command: "); 
string command = Console.ReadLine(); 

while (!command.Equals("q")) 
{ 
    try 
    { 
     switch (command) 
     { 
      case "ls public": 
       GetStatuses(http, "public_timeline.xml"); 
       break; 
      case "ls friends": 
       GetStatuses(http, "friends_timeline.xml"); 
       break; 
      case "ls": 
       GetStatuses(http, "user_timeline.xml"); 
       break; 

     } 
    } 
    catch (Exception ex) 
    { 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.WriteLine(ex.Message); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
    } 

    Console.WriteLine("\nPlease enter a command: "); 
    Console.ReadLine(); 
} 

다른 코드 여기에서

static void GetStatuses(HttpClient http, string uri) 
     { 
      HttpResponseMessage resp= http.Get(uri); 
      resp.EnsureStatusIsSuccessful(); 
      DisplayTwitterStatuses(resp.Content.ReadAsXElement()); 
     } 

     static void DisplayTwitterStatuses(XElement root) 
     { 
      var statuses = root.Descendants("status"); 
      foreach (XElement status in statuses) 
      { 
       Console.ForegroundColor = ConsoleColor.Green; 
       Console.Write(status.Element("user").Element("screen_name").Value); 
       Console.ForegroundColor = ConsoleColor.Gray; 
       Console.Write(" {0} ",status.Element("id").Value); 
       Console.ForegroundColor = ConsoleColor.White; 
       string text = status.Element("text").Value; 
       if (text.Length > 50) 
        text = text.Remove(50) + "...."; 

       Console.WriteLine(text); 
       Console.ForegroundColor = ConsoleColor.Yellow; 

      } 

     } 

를 도움말 문서를 찾아주세요 ls "라고 표시하면 내 자격 증명이 유효하더라도 승인 오류가 발생합니다.

Unauthorized (401) is not one of the following: OK (200), Created (201), Accepted (202), NonAuthoritativeInformation (203), NoContent (204), ResetContent (205), PartialContent (206) 

해결 방법을 찾으십시오. 트위터 또는 다른 공급 업체 (구글 ..) 당신이 Matlus basic library을 지원할 수, 일을 쉽게하기 위해 Oauth 1.0 or 2.0

참조 트위터 Authentication documentation

기반의 보안 인증을 제공해야 할 정보를 얻기 위하여

+0

솔루션을 찾았습니까? 이 특정 문제도 있습니다. 우리는 Oauth 인증 프로세스에 기반한 access_key 헤더를 전달해야한다고 생각합니다. – Silagy

+2

감사합니다. silagy,하지만 저는 여전히이 문제에 직면하고 있습니다. – Sujit

답변

0

See code project on google

그들은 아주 좋은 예를 제공했습니다. 나는 그것과 성공을 사용했다. link - - OAuth를에 섹션 소개를 참조하십시오

  • 요청

    은 기본적으로 당신은 트위터에서 응용 프로그램을 등록하는 staps

    1. 흐름과 고객 키와
    2. 트위터에
    3. 참조 인증 문서 키의 비밀 고객을 얻을 필요 요청 토큰의 경우
    4. 사용자 인증 요청
    5. 액세스 토큰 요청
    6. OauthBase.cs는
    7. 와 OAuthUtils.cs를 사용하여 인증 헤더를 생성하여 서명을 생성 http://api.twitter.com/1/statuses/home_timeline.json
    8. - 예를 들어, 웹 요청을이 라이브러리

      protected void Page_Load(object sender, EventArgs e) 
      { 
          realm = Request.Url.Scheme + "://" + Request.Url.DnsSafeHost + Request.ApplicationPath; 
      
          if (!IsPostBack) 
          { 
           if (Request.QueryString["oauth_token"] ==null) 
           { 
            MakeRequestForToken(); 
           } 
           else 
           { 
            HandleAuthorizeTokenResponse(); 
           } 
          } 
      
      
      
      } 
      
      private void MakeRequestForToken() 
      { 
          string consumerKey = null; 
          string consumerSecret = null; 
          string requestTokenEndpoint = null; 
          string requestTokenCallback = null; 
          string authorizeTokenUrl = null; 
      
          consumerKey = "my customer key"; 
          consumerSecret = "my customer secret key"; 
      
          //Twitter 
          requestTokenEndpoint = "https://api.twitter.com/oauth/request_token"; 
      
          requestTokenCallback = GetRouteableUrlFromRelativeUrl("oAuthGoolgecsSharp/GoogleOauthTry.aspx"); 
      
      
          //Twitter 
          authorizeTokenUrl = "https://api.twitter.com/oauth/authorize"; 
      
      
          if (String.IsNullOrEmpty(consumerKey) || String.IsNullOrEmpty(consumerSecret)) 
           throw new ArgumentException("Please set up your consumer key and consumer secret for the selected provider", "consumerKey or consumerSecret"); 
      
          // Step 1: Make the call to request a token 
          var oAuthConsumer = new OAuthConsumer(); 
          var requestToken = oAuthConsumer.GetOAuthRequestToken(requestTokenEndpoint, realm, consumerKey, consumerSecret, requestTokenCallback); 
          PersistRequestToken(requestToken); 
      
          // Step 2: Make a the call to authorize the request token 
          Response.Redirect(authorizeTokenUrl + "?oauth_token=" + requestToken.Token); 
      } 
      
      /// <summary> 
      /// Step 3: Exchange the Request Token for an Access Token 
      /// </summary> 
      private void HandleAuthorizeTokenResponse() 
      { 
          string consumerKey = null; 
          string consumerSecret = null; 
          string accessTokenEndpoint = null; 
          string token = null; 
          string verifier = null; 
      
          provider = "Google"; 
      
          token = Request.QueryString["oauth_token"]; 
          verifier = Request.QueryString["oauth_verifier"]; 
          //Google 
          //accessTokenEndpoint = "https://www.google.com/accounts/OAuthGetAccessToken"; 
      
          //Twitter 
          accessTokenEndpoint = "https://api.twitter.com/oauth/access_token"; 
      
          if (String.IsNullOrEmpty(consumerKey) || String.IsNullOrEmpty(consumerSecret)) 
           throw new ArgumentException("Please set up your consumer key and consumer secret for the selected provider", "consumerKey or consumerSecret"); 
      
          // Exchange the Request Token for an Access Token 
          var oAuthConsumer = new OAuthConsumer(); 
          var accessToken = oAuthConsumer.GetOAuthAccessToken(accessTokenEndpoint, realm, consumerKey, consumerSecret, token, verifier, GetRequesttoken().TokenSecret); 
          this.SaveAccessTokken(accessToken); 
          Response.Redirect("~/TaksList.aspx"); 
      } 
      
      RequestToken GetRequesttoken() 
      { 
          var requestToken = (RequestToken)Session["RequestToken"]; 
          Session.Remove("RequestToken"); 
          return requestToken; 
      } 
      
      void PersistRequestToken(RequestToken requestToken) 
      { 
          Session["RequestToken"] = requestToken; 
      } 
      
      string GetRouteableUrlFromRelativeUrl(string relativeUrl) 
      { 
          var url = HttpContext.Current.Request.Url; 
          return url.Scheme + "://" + url.Authority + VirtualPathUtility.ToAbsolute("/" + relativeUrl); 
      } 
      
      private void SaveAccessTokken(AccessToken tokken) 
      { 
          Session.Add("AccessTokken",tokken); 
      } 
      
      1. 를 사용

      내 코드 예제 (210) 메서드 호출 GetUserInfoAuthorizationHeader

    9. 요청 헤더에 권한 부여
    10. 요청을 보내고받을 데이터

  • 내 코드 예제 개인 AccessToken _accessToken = 널 (null)을 참조하십시오;

    protected void Page_Load(object sender, EventArgs e) 
    { 
        _accessToken = (AccessToken)Session["AccessTokken"]; 
        string _customerkey = "my customer key"; 
        string _customerSecret = "my customer secret key"; 
    
    
        string nostring = ""; 
        string nnString = ""; 
        OAuthBase oauth = new OAuthBase(); 
    
        //Twitter 
        Uri t = new Uri("http://api.twitter.com/1/statuses/home_timeline.xml"); 
        string u = oauth.GenerateSignature(t, _customerkey, _customerSecret, _accessToken.Token, 
                 _accessToken.TokenSecret, "GET", oauth.GenerateTimeStamp(), 
                 oauth.GenerateNonce(), out nostring, out nnString); 
    
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(nostring); 
        request.Method = "GET"; 
    
    
        string realm = Request.Url.Scheme + "://" + Request.Url.DnsSafeHost + Request.ApplicationPath; 
    
        OAuthUtils util = new OAuthUtils(); 
        AuthorizeHeader h = util.GetUserInfoAuthorizationHeader(t.ToString(), realm, _customerkey, _customerSecret, 
                   _accessToken.Token, _accessToken.TokenSecret, 
                   SignatureMethod.HMACSHA1, "GET"); 
    
        request.Headers.Add("Authorization",h.ToString()); 
        Response.Write(request.Headers["Authorization"].ToString() + "<br />"); 
    
        try 
        { 
         WebResponse response = request.GetResponse(); 
         StreamReader reader = new StreamReader(response.GetResponseStream()); 
         string responseString = reader.ReadToEnd(); 
         reader.Close(); 
         Response.Write(responseString); 
        } 
        catch (Exception ex) 
        { 
         Response.Write(ex.ToString()); 
         //throw; 
        } 
    
    
    
    
    
    }