我正在阅读http://dev.twitter.com/pages/auth的演练,但编码回调网址似乎存在不一致。回调列为:
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编码。为什么他们不一致?
答案 0 :(得分:6)
编码不一致,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 ...