1

我的 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

4

1 回答 1

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))

这意味着%键和值的百分比转义字符中的符号本身被转义,因此#变成 first%23然后变成%2523,因为E('%') = '%25'.

如果你按照标准一步一步做,你应该做得很好。如果您在没有等效性证明的情况下偏离标准,您很可能会误入歧途。

于 2011-08-27T22:09:01.830 回答