我的xauth实现遇到了一个非常奇怪的错误。
密码包含“#”时失败。我掏出原始标题,它看起来几乎与另一个有效的应用程序完全相同,除了一个不同的看起来的nonce(它有关系吗?)
我正在使用的代码在这里: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
答案 0 :(得分: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'
。
如果你按照标准的步骤,你应该做得很好。如果你在没有等效证明的情况下偏离标准,你可能会误入歧途。