2010-05-29 56 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将使签名“无效”。