2010-05-29 52 views
0

我正在與Django活塞一起嘗試創建支持oAuth的API。「簽名無效」:與Django活塞oAuth供應商

我開始了使用教程在:

http://blog.carduner.net/2010/01/26/django-piston-and-oauth/

我增加了一個消費者活塞的管理界面與密鑰和密碼都設置爲「ABCD」用於測試目的。

這些網址已成功連線並調用了oAuth提供程序。

但是,運行我的GET請求令牌與測試TripIt的(蟒蛇get_request_token.py「http://127.0.0.1:8000/api」 ABCD ABCD),我收到以下錯誤:

Invalid signature. Expected signature base string: GET&http%3A%2F%2F127.0.0.1%3A8000%2Fapi%2Foauth%2Frequest_token%2F&oauth_consumer_key%3Dabcd%26oauth_nonce%3D0c0bdded5b1afb8eddf94f7ccc672658%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1275135410%26oauth_version%3D1.0

的問題似乎在於活塞的的_check_signature方法內oauth.py,其中

valid_sig = signature_method.check_signature(oauth_request, consumer, token, signature) 

返回false。然而,我不能解決如何得到驗證的簽名。

任何想法?

更新:

如果我刪除從活塞的後端測試的消費者,返回的響應正確設置爲「無效的消費者」,所以此查找似乎是工作。

回答

0

我發現的最終答案是將oauth_consumer的工作副本安裝到應用程序目錄中。一旦我在該應用程序中添加了我的消費者,一切都按預期工作。

+0

...此外,另一個問題是URL末尾所需的「/」之間的差異;請求中額外的%2F使簽名無效。 – 2010-05-30 16:58:32

0

@Ricardo和其他人有這個錯誤的問題(抱歉的「答案」,我還沒有評論),我能夠避免這個錯誤,通過生成我的簽名從遵循提供的測試用例在活塞的代碼中。例如:

>>> from piston.oauth import * 
>>> from piston.models import * 
>>> consumer = Consumer.objects.get(id=1) 
>>> oaconsumer = OAuthConsumer(consumer.key, consumer.secret) 
>>> request = OAuthRequest.from_consumer_and_token(oaconsumer, http_url='http: 
    //localhost:8000/api/oauth/request_token/') 
>>> signature_method = OAuthSignatureMethod_HMAC_SHA1() 
>>> request.sign_request(signature_method, oaconsumer, None) 
>>> request.sign_request(signature_method, oaconsumer, None) 
>>> request.parameters 
{'oauth_nonce': '64379482', 'oauth_timestamp': 1297147940, 'oauth_consumer_key': u'8aZSFj3W54h8J8sCpx', 'oauth_signature_method': 'HMAC-SHA1', 'oauth_version': '1.0', 'oauth_signature': 'kGSLCZjYzAHXsa8f9sL52Kq1F2w='} 

從這裏,只需在瀏覽器中使用這些參數,例如 http://localhost:8000/api/oauth/request_token/?oauth_nonce=64379482&oauth_timestamp=1297147940&oauth_consumer_key=8aZSFj3W54h8J8sCpx&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_signature=kGSLCZjYzAHXsa8f9sL52Kq1F2w=

產生 「oauth_token_secret = 37VZKRV3fXRLAw5tekZD2bwnMhXqGwgx &的oauth_token = LRnexBGTNC4nDXpv9M & oauth_callback_confirmed =真正的」

正如馬丁指出,留出一個 「/」 無論是在示例代碼或URL將使簽名「無效」。