DotNetOpenAuth是一个了不起的包。但是,我不断遇到一些障碍。到现在大部分都解决了,现在我遇到了一个问题,这占用了我很多时间。
问题:我想使用 DotNetOpenAuth 在linkedin 上分享一篇文章。前段时间我可以分享一些帖子,但突然之间事情已经坏了,我不能再发布分享了。我不记得对我的代码进行了太多更改。有人可以看看我的诊断,代码,看看我是否搞砸了?
诊断:我在通过我的代码和 LinkedIn 的Rest Console发出请求时运行了 fiddler 。以下是两种场景的 Fiddler 输出:
通过 Linkedin 提供的 Rest Console 发出的请求的 Fiddler 输出
POST /v1/people/~/shares HTTP/1.1
Authorization: OAuth oauth_consumer_key="{consumer_key}",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1362258084",oauth_nonce="-141812272",oauth_version="1.0",oauth_token="{access_token}",oauth_signature="HBMUfvHYJAxz%2BszxStVJ%2BhfQPEQ%3D"
Host: api.linkedin.com
Content-Length: 645
X-Target-URI: http://api.linkedin.com
Content-Type: application/xml
Connection: Keep-Alive
<?xml version="1.0" encoding="UTF-8"?>
<share>
<comment>test comment</comment>
<content>
<title>test title</title>
<submitted-url>{my_test_url}</submitted-url>
<submitted-image-url>{my_image_url}</submitted-image-url>
</content>
<visibility>
<code>anyone</code>
</visibility>
</share>
通过我的代码发出的请求的提琴手输出(使用 DNOA):
POST http://api.linkedin.com/v1/people/~/shares HTTP/1.1
Authorization: OAuth oauth_token="{access_token}",oauth_consumer_key="{my_consumer_key}",oauth_nonce="ECYFLc0l",oauth_signature_method="HMAC-SHA1",oauth_signature="FobR745YkMlmBpOqoTDr8CwGZIQ%3D",oauth_version="1.0",oauth_timestamp="1362263560"
Content-Type: application/xml
Host: api.linkedin.com
Content-Length: 510
Connection: Keep-Alive
<?xml version="1.0" encoding="UTF-8"?>
<share>
<comment>test comment</comment>
<content>
<title>test title</title>
<description>test description</description>
<submitted-url>{my_test_url}</submitted-url>
<submitted-image-url>{my_image_url}</submitted-image-url>
</content>
<visibility>
<code>anyone</code>
</visibility>
</share>
更多细节:
我知道在执行 oauth 身份验证时我需要通过范围,所以已经有了这个。当用户授权我的应用程序时,我还会收到正确的权限提示,显示为“网络更新以您的身份检索并发布更新到 LinkedIn”
请注意,我确实获得了访问令牌,并且我能够执行一些读取操作,例如使用此令牌获取用户详细信息,但是,我无法使用该令牌在 LinkedIn 上共享帖子。目前实施使用的是LinkedIn oAuth 1.0a。
这也是我的代码块:
public bool PostToLinkedIn(WebConsumer consumer, string sShareMessageXml, string accessToken = null)
{
var payload = Encoding.ASCII.GetBytes(sShareMessageXml);
AuthorizedTokenResponse token = null;
bool bIsAccessTokenSupplied = !string.IsNullOrEmpty(accessToken);
if (!bIsAccessTokenSupplied)
{
token = consumer.ProcessUserAuthorization();
}
if (token != null || bIsAccessTokenSupplied)
{
this.AccessToken = bIsAccessTokenSupplied ? accessToken : token.AccessToken;
var resourceEndpoint = new MessageReceivingEndpoint("http://api.linkedin.com/v1/people/~/shares", HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
HttpWebRequest request = consumer.PrepareAuthorizedRequest(resourceEndpoint, AccessToken);
request.ServicePoint.Expect100Continue = false;
request.Method = "POST";
request.ContentLength = payload.Length;
request.ContentType = "application/xml";
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(payload, 0, payload.Length);
}
var response = consumer.Channel.WebRequestHandler.GetResponse(request);
var responseData = response.GetResponseReader().ReadToEnd();
var xmlData = XDocument.Parse(responseData);
if (xmlData.Elements(XName.Get("update")).Any())
{
return true;
}
}
return false;
}
如果您需要更多详细信息,请告诉我。任何帮助都会很棒。
我也在 DNOA 的 google 组上发布了相同问题的简短版本。希望有人遇到过这个问题并有解决方案。