dotnetopenauth twitter api 1.1签名请求

时间:2014-01-09 14:11:23

标签: twitter twitter-oauth dotnetopenauth

我开始使用DNOA库来获取twitter 1.1 api

enter code here

我正在尝试调用users / show.json api

    protected override AuthenticationResult VerifyAuthenticationCore(AuthorizedTokenResponse response)
    {
        string accessToken = response.AccessToken;
        string str2 = response.ExtraData["user_id"];
        string userName = response.ExtraData["screen_name"];
        Uri location = new Uri("https://api.twitter.com/1.1/users/show.json?user_id=" + str2);
        MessageReceivingEndpoint profileEndpoint = new MessageReceivingEndpoint(location, HttpDeliveryMethods.GetRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
        HttpWebRequest request = base.WebWorker.PrepareAuthorizedRequest(profileEndpoint, accessToken);
        Dictionary<string, string> dictionary = new Dictionary<string, string>();
        dictionary.Add("accesstoken", accessToken);
        try
        {
            using (WebResponse wresponse = request.GetResponse())
            {
                var str = Utilities.ProcessResponse(wresponse);
                var json = JObject.Parse(str);
                dictionary.AddNotEmpty("name", json.Value<string>("name"));
                dictionary.AddNotEmpty("location", json.Value<string>("location"));
                dictionary.AddNotEmpty("description", json.Value<string>("description"));
                dictionary.AddNotEmpty("url", json.Value<string>("url"));
            }
        }
        catch (Exception)
        {
        }
        return new AuthenticationResult(true, base.ProviderName, str2, userName, dictionary);
    }

发送给Twitter的内容

GET https://api.twitter.com/1.1/users/show.json?user_id=2193937074 HTTP/1.1
Authorization: OAuth oauth_token="2193937074-cgmZbmJIIb75f7MkQgbdjuvQaen2xzM1WFXXC7G",oauth_consumer_key="XVCgN3fkwzTGgeSm1FBa1Q",oauth_nonce="93UjjRkP",oauth_signature_method="HMAC-SHA1",oauth_signature="YzfXzU3VeEI9xl2SfuknPB33%2FiM%3D",oauth_version="1.0",oauth_timestamp="1389265955"
Host: api.twitter.com

答案是

HTTP/1.1 401 Unauthorized
content-length: 63
content-type: application/json; charset=utf-8
date: Thu, 09 Jan 2014 11:12:36 UTC
server: tfe
set-cookie: guest_id=v1%3A138926595613849064; Domain=.twitter.com; Path=/; Expires=Sat, 09-Jan-2016 11:12:36 UTC
strict-transport-security: max-age=631138519

{"errors":[{"message":"Could not authenticate you","code":32}]}

dev.twitter的OAuth工具显示签名标头的有效样本:

GET https://api.twitter.com/1.1/users/show.json?user_id=2193937074 HTTP/1.1
Authorization: OAuth oauth_consumer_key="XVCgN3fkwzTGgeSm1FBa1Q", oauth_nonce="dbf6f6c1aa6dc226de25265da3d63167", oauth_signature="K3Qfyc9qANFgckQNyqsaDWCnh%2BY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1389266681", oauth_token="2193937074-cgmZbmJIIb75f7MkQgbdjuvQaen2xzM1WFXXC7G", oauth_version="1.0"
Host: api.twitter.com

它的主要区别在于oauth_nonce的长度?

DNOA - oauth_nonce =“93UjjRkP”

OAuth工具 - oauth_nonce =“dbf6f6c1aa6dc226de25265da3d63167”

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

主要问题是如何创建签名,TokenSecret被排除在其形成之外。此行为的核心是AuthenticationOnlyCookieOAuthTokenManager管理器,它在基础DotNetOpenAuth.AspNet.Clients.TwitterClient类中使用。

public class AuthenticationOnlyCookieOAuthTokenManager : IOAuthTokenManager
{
...
    public virtual void ReplaceRequestTokenWithAccessToken(string requestToken, string accessToken, string accessTokenSecret)
    {
        HttpCookie cookie = new HttpCookie("OAuthTokenSecret") {
            Value = string.Empty, //<<< now it's empty
            Expires = DateTime.UtcNow.AddDays(-5.0)
        };
        this.Context.Response.Cookies.Set(cookie);
    }
...
}

只需删除tokenSecret;

解决方案是使用DotNetOpenAuth.AspNet.Clients.InMemoryOAuthTokenManager类。因此,您只需从OAuthClient派生并实现正确的构造函数:

public class TwitterClient :  DotNetOpenAuth.AspNet.Clients.OAuthClient
{
    protected TwitterClient(string appKey, string appSecret) : 
        base ("twitter", 
             new DotNetOpenAuthWebConsumer(
                 TwitterServiceDescription, 
                 new InMemoryOAuthTokenManager(appKey, appSecret)))
    { }
...
}

还找到了熟悉的帖子Custom OAuth client in MVC4 / DotNetOpenAuth - missing access token secret