我正在嘗試使用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
有什麼想法?