2011-08-26 61 views
1

我的xauth实现遇到了一个非常奇怪的错误。XAuth在密码中包含“#”时失败

密码中包含“#”时失败。我探听出原始消息头,它看起来几乎一模一样的另一个应用是工作,除了寻找不同的随机数

我使用的代码是在这里(这很重要):http://pastie.org/2436098

--------MY LIBRARY :FAIL-------- 

POST /oauth/access_token HTTP/1.1 
Host: api.twitter.com 
User-Agent: onethingaday/1.0 CFNetwork/485.13.8 Darwin/10.7.0 
Authorization: OAuth oauth_nonce="70943970", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1314400256", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature="1VYDQYL5WvkbovQggNUjuY9t%2Fvc%3D", oauth_version="1.0" 
Accept: */* 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 78 
Connection: keep-alive 
Proxy-Connection: keep-alive 

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk 


--------SNOOPING ANOTHER APP : SUCCESS-------- 

POST /oauth/access_token HTTP/1.1 
Host: api.twitter.com 
User-Agent: XAuthTwitterEngineDemo/1.0 CFNetwork/485.13.8 Darwin/10.7.0 
Content-Length: 78 
Content-Type: application/x-www-form-urlencoded 
Authorization: OAuth realm="", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature_method="HMAC-SHA1", oauth_signature="mEyjwksg1NoaY2VMQBf70ZN3OhM%3D", oauth_timestamp="1314400386", oauth_nonce="4DF9C426-08F8-49FC-9E1B-576FDBDA8836", oauth_version="1.0" 
Accept: */* 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Proxy-Connection: keep-alive 

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk 

回答

2

您很可能已经篡改了签名基本字符串。您构建参数的方式是尝试快捷方式并更改某些步骤,并且似乎缺少编码级别。你正在构建相同的元件的参数列表:

E(k) + E('=') + E(v) 

然后通过合并,编码键值对字符串对它们进行排序,那么所有这些字符串合并同类

P_{i} + E('&') + P_{i + 1} 

这错过的编码级别对对,因为你应该有相应的参数签名基本字符串的部分实际上是(假设为简单起见两个关键 - 值对),结束了一下:

E(E(k) + '=' + E(v) + '&' + E(k2) + '=' + E(v2)) 
= 
E(E(k)) + E('=') + E(E(v)) + E('&') + E(E(k2)) + E('=') + E(E(v2)) 

这意味着%中的密钥和值的转义字符百分比符号本身已被转义,因此#转为首先%23,然后转换为%2523,因为E('%') = '%25'

如果你按照标准的步骤,你应该没问题。如果你在没有等效性证明的情况下脱离标准,你可能会误入歧途。

+0

谢谢杰里米一个惊人的答案!我怎么把这两次调高一点?我最终扯掉了我的实现,并用这个:http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer –

+0

只是证明你不应该在标准方面太聪明。 –