2013-01-02 31 views
1

我正在嘗試使用DotNetOpenAuth編寫基本程序來代表用戶搜索人員。只是一個簡單的程序來嘗試瞭解OAuth。現在我卡住了試圖授權,但是當我嘗試這樣做時,我從linkedIn得到一個HTTP 400狀態碼。當我嘗試使用DotNetOpenAuth訪問其API時,從LinkedIn獲取HTTP 400錯誤

我試過使用DesktopConsumer和WebConsumers,兩者都以相同的方式失敗。我知道導致exceptioin的特定函數是在第34行對RequestUserAuthorization的調用,我試過使用空字典和空值作爲它的輸入,但沒有發生任何事情。

我爲程序使用了兩個類TestLinkedIn.cs類,它包含主類和一個LinkedInTokenManager.cs類,這是一個非常簡單的IConsumerTokenManager實現。

以下是TestLinkedIn.cs的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using DotNetOpenAuth.Messaging; 
using DotNetOpenAuth.OAuth.Messages; 
using DotNetOpenAuth.OAuth; 
using DotNetOpenAuth.OAuth.ChannelElements; 

namespace Project 
{ 
    class TestLinkedIn 
    { 
     #region Variables 
     private static string APIKey = "APIKey"; 
     private static string APISecret = "APISecret"; 
     private static string OAuthToken = "OAuthToken"; 
     private static string OAuthSecret = "OAuthSecret"; 
     #endregion 

     static void Main(string[] args) 
     { 
      ServiceProviderDescription linkedIn = LinkedInDescription(); 
      LinkedInTokenManager tokenManager = new LinkedInTokenManager(OAuthToken, OAuthSecret);//APIKey,APISecret);// 
      DesktopConsumer web = new DesktopConsumer(linkedIn,tokenManager); 
      string requestToken = ""; 
      Uri authUrl = new Uri("https://steve.com");// ("https://api.linkedin.com/uas/oauth/requestToken");//"http" + "://" + "api.linkedin.com" + "/Home/OAuthCallBack"); 
      Dictionary<string, string> empty = new Dictionary<string, string>(); 
      try{ 
       //UserAuthorizationRequest request = web.PrepareRequestUserAuthorization(null, null, null, out requestToken);//null, null, null);//authUrl, null, null); 
       //UserAuthorizationRequest request =web.Channel.Request(new AccessProtectedResourceRequest()); 
       //web.Channel.Send(request); 
       authUrl = web.RequestUserAuthorization(empty, empty, out requestToken); 
       Console.WriteLine(requestToken); 
       Console.ReadKey(); 
      } 
      catch (ProtocolException e) 
      { 
       Console.Write(e.StackTrace); 
       Console.WriteLine("Error detected"); 
       //Console.ReadKey(); 
      } 
     } 

     private static ServiceProviderDescription LinkedInDescription(){ 
      ServiceProviderDescription linkedIn = new ServiceProviderDescription(); 
      linkedIn.AccessTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint 
       ("https://api.linkedin.com/uas/oauth/accessToken", DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest); 
      linkedIn.RequestTokenEndpoint = new DotNetOpenAuth.Messaging.MessageReceivingEndpoint 
       ("https://api.linkedin.com/uas/oauth/requestToken",DotNetOpenAuth.Messaging.HttpDeliveryMethods.PostRequest); 
      linkedIn.UserAuthorizationEndpoint = new MessageReceivingEndpoint("https://www.linkedin.com/uas/oauth/authorize", 
       HttpDeliveryMethods.PostRequest); 
      linkedIn.TamperProtectionElements =new ITamperProtectionChannelBindingElement[] 
       {new HmacSha1SigningBindingElement()}; 
      linkedIn.ProtocolVersion=ProtocolVersion.V10a; 
      return linkedIn; 
     } 
    } 
} 

,這裏是爲LinkedInTokenManager

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using DotNetOpenAuth.OAuth.ChannelElements; 
using DotNetOpenAuth.OAuth.Messages; 

namespace Project 
{ 
    class LinkedInTokenManager : IConsumerTokenManager 
    { 
     private Dictionary<string, string> tokens = new Dictionary<string, string>(); 
     private string consumerKey; 
     private string consumerSecret; 

    public LinkedInTokenManager(string Key, string Secret) 
    { 
     consumerKey = Key; 
     consumerSecret = Secret; 
    } 
    public string ConsumerKey 
    { 
     get { return consumerKey; } 
    } 

    public string ConsumerSecret 
    { 
     get { return consumerSecret; } 
    } 

    public void ExpireRequestTokenAndStoreNewAccessToken(string consumerKey, string requestToken, string accessToken, string accessTokenSecret) 
    { 
     tokens.Remove(requestToken); 
     tokens[accessToken] = accessTokenSecret; 
    } 

    public string GetTokenSecret(string token) 
    { 
     try 
     { 
      return tokens[token]; 
     } 
     catch (KeyNotFoundException k) 
     { 
      return null; 
     } 
    } 

    public TokenType GetTokenType(string token) 
    { 
     throw new NotImplementedException(); 
    } 

    public void StoreNewRequestToken(UnauthorizedTokenRequest request, ITokenSecretContainingMessage response) 
    { 
     tokens[response.Token] = response.TokenSecret; 
    } 
    } 
} 

代碼這是我張貼到服務器的東西。

oauth_callback=oob&oauth_consumer_key=6415f7ed-d618-422a-b090-73f3056653d7&oauth_nonce=nGQjFcC1&oauth_signature_method=HMAC-SHA1&oauth_signature=XmUBfGVGDoBZDOC%2Bjp4Fj68MPGI%3D&oauth_version=1.0&oauth_timestamp=1357136418 

這裏是來自錯誤消息的堆棧跟蹤。

at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options) 
    at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request) 
     at DotNetOpenAuth.Messaging.Channel.GetDirectResponse(HttpWebRequest webRequest) 
     at DotNetOpenAuth.Messaging.Channel.RequestCore(IDirectedProtocolMessage request) 
     at DotNetOpenAuth.Messaging.Channel.Request(IDirectedProtocolMessage requestMessage) 
     at DotNetOpenAuth.Messaging.Channel.Request[TResponse](IDirectedProtocolMessage requestMessage) 
     at DotNetOpenAuth.OAuth.ConsumerBase.PrepareRequestUserAuthorization(Uri callback, IDictionary`2 requestParameters, IDictionary`2 redirectParameters, String& requestToken) 
     at DotNetOpenAuth.OAuth.DesktopConsumer.RequestUserAuthorization(IDictionary`2 requestParameters, IDictionary`2 redirectParameters, String& requestToken) 
     at APIphanySalesProject.TestLinkedIn.Main(String[] args) in c:\Users\Admin\Documents\Visual Studio 2012\Projects\Project\Project\TestLinkedIn.cs:line 34 

有什麼想法?

回答

0

如果您遇到與我一樣的問題,請嘗試檢查計算機的時間設置。時間時區都需要正確才能生成正確的時間戳,這是我的程序出了什麼問題。

0

我遇到了同樣的錯誤在LinkedIn API的工作,而當你在https://www.linkedin.com/secure/developer註冊應用程序確保當OAuth的密鑰生成你撤銷點擊這將刪除的OAuth用戶令牌和用戶的機密,一旦呼叫通過您的應用程序使其將動態創建新的OAuth令牌。 閱讀下面的文檔,瞭解更多 https://developer.linkedin.com/documents/authentication 有關詳細步驟如下 http://infinityexist.wordpress.com/2014/08/25/solution-for-400-bad-request-of-access-token-in-linkedin-api/

相關問題