2

我正在阅读http://dev.twitter.com/pages/auth上的演练,但在编码回调 URL 时似乎存在不一致。回调被列为:
oauth_callback - http://localhost:3005/the_dance/process_callback?service_provider_id=11

签名基本字符串列为:
POST&...oauth_callback%3D http%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11 %26oauth_consumer_key%3D...

回调在这里似乎是双重编码的。

签名的授权标头列为:
OAuth oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk", oauth_callback=" http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11 ", ...

在这里,回调似乎是单个 URL 编码的。为什么它们不一致?

4

1 回答 1

6

编码并没有不一致,URL只是在两种不同的情况下使用,有两种不同的要求。

该 URL 在您的应用程序中开始时未编码。您发布的第二个示例是将作为标头传递给服务器的值,因此它必须是 URL 编码的(即一次)。

签名的授权标头列为:OAuth oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk", oauth_callback="http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11", ...

然后,所有 OAuth 标头参数的值必须与其他必需的值组合以创建用于签名的基本字符串。基本字符串是根据传递给服务器的值创建的。因此,您正在获取传递给服务器的值,即您已经编码的 URL,并将其与其他值组合在一起,每个值都必须经过 URL 编码,以形成一个由 . 分隔的新字符串&

您可以看到为什么必须这样做,因为基本字符串的第三部分包含查询参数,这些参数的值已经经过 URL 编码(如oauth_callback)并&用作分隔符。为了将此查询参数列表(包含&)安全地组合到基本字符串中(也&用作分隔符),它必须在连接之前再次进行 URL 编码。此时oauth_callback已被编码两次,一次单独编码,一次作为更大组合值的一部分:

签名基本字符串列为:POST&...oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3D...

于 2010-07-20T17:33:50.790 回答