Я следовал инструкции на http://dev.twitter.com/pages/auth#request-token, и разработал класс c # для выполнения авторизации OAuth. Я использовал параметры на странице, и базовая строка выходной подписи и подпись совпадают с той, что на странице. Поэтому я думаю, что часть алгоритма верна. Затем я заменил параметры на те, что были в моем приложении Twitter, но мне не удалось получить токен запроса из службы Twitter. И данные ответа «Не удалось проверить подпись и токен oauth».
Вот запрос, который я отправляю (для отладки я использовал http, а не https):
POST http://api.twitter.com/oauth/request_token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_callback="http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11", oauth_consumer_key="GDdmIQH6jhtmLUypg82g", oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1272323042", oauth_version="1.0", oauth_signagure="IP%2FEEoc4tKdiobM%2FKH5cPK69cJM%3D"
Host: api.twitter.com
Proxy-Connection: Keep-Alive
А вот и ответ:
HTTP/1.1 401 Unauthorized
Connection: Keep-Alive
Connection: Proxy-Support
Content-Length: 44
Via: 1.1 APS-PRXY-09
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Date: Fri, 08 Apr 2011 05:47:20 GMT
Content-Type: text/html; charset=utf-8
Server: hi
Proxy-Support: Session-Based-Authentication
Status: 401 Unauthorized
X-Transaction: 1302241640-40339-46793
Last-Modified: Fri, 08 Apr 2011 05:47:20 GMT
X-Runtime: 0.01519
Pragma: no-cache
X-Revision: DEV
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Set-Cookie: k=207.46.55.29.1302241640766556; path=/; expires=Fri, 15-Apr-11 05:47:20 GMT; domain=.twitter.com
Set-Cookie: guest_id=13022416407746962; path=/; expires=Sun, 08 May 2011 05:47:20 GMT
Set-Cookie: _twitter_sess=BAh7CDoPY3JlYXRlZF9hdGwrCEiBpjMvAToHaWQiJWMzMTViOGZiNDkzMDRi%250ANjNhMmQwYmVkZDBhNTc2NTc4IgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVy%250AOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA--177afd5c0f6fe30005ab9a9412e6f85ab03cbfa7; domain=.twitter.com; path=/; HttpOnly
Vary: Accept-Encoding
Failed to validate oauth signature and token
Вот так я генерирую нормализованные параметры:
string.Join("&", (from d in this.BuildParameterDict()
select string.Format("{0}={1}", OAuthEncoding.Encode(d.Key), OAuthEncoding.Encode(d.Value))))
Метод BuildParameterDict отсортирует построение списка с: параметрами из строки запроса; параметры от тела; параметры, специфичные для «oauth», кроме «oauth_signature».
Тогда базовая строка подписи генерируется:
StringBuilder sb = new StringBuilder();
sb.Append(OAuthEncoding.Encode(this._request.Method));
sb.Append('&');
sb.Append(OAuthEncoding.Encode(this.GetNormalUri()));
sb.Append('&');
sb.Append(OAuthEncoding.Encode(this.GetNormalParameters()));
Это сгенерированная базовая строка с параметрами из вышеприведенной страницы:
POST & HTTPS% 3A% 2F% 2Fapi.twitter.com% 2Foauth% 2Frequest_token & oauth_callback% 3Dhttp% 253A% 252F% 252Flocalhost% 253A3005% 252Fthe_dance% 252Fprocess_callback% 253Fservice_provider_id% 253D11% 26oauth_consumer_key% 3DGDdmIQH6jhtmLUypg82g% 26oauth_nonce% 3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk% 26oauth_signature_method% 3DHMAC-SHA1 % 26oauth_timestamp% 3D1272323042% 26oauth_version% 3D1.0
, что соответствует строке на этой странице.