2010-07-19 61 views
2

我正在閱讀演練http://dev.twitter.com/pages/auth,但似乎在編碼回調URL時存在不一致。回調被列爲:
oauth_callback - http://localhost:3005/the_dance/process_callback?service_provider_id=11Twitter Oauth URL編碼不一致?

簽名基本字符串被列爲:
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編碼。他們爲什麼不一致?

回答

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