“无效签名”:带有Django-piston的oAuth提供程序

时间:2010-05-29 14:32:33

标签: django oauth django-piston

我正在使用django-piston尝试创建支持oAuth的API。

我开始使用以下教程:

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

我向活塞的管理界面添加了一个消费者,密钥和密钥都设置为“abcd”以进行测试。

网址成功连线,并调用oAuth提供程序。

但是,使用tripit运行我的get请求令牌测试(python get_request_token.py“http://127.0.0.1:8000/api”abcd abcd),我收到以下错误:

  

签名无效。预期签名   基本字符串:   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

这个问题似乎存在于Piston的oauth.py的_check_signature方法中,其中

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

返回false。但是,我不能弄清楚如何验证签名。

有什么想法吗?

更新

如果我从活塞的后端删除测试使用者,则返回的响应被正确设置为“无效的使用者”,因此此查找似乎正在运行。

2 个答案:

答案 0 :(得分:0)

我发现最终的答案是将oauth_consumer的工作副本安装到应用程序目录中。一旦我在这个应用程序中添加了我的消费者,一切都按预期工作。

答案 1 :(得分: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 = true”

正如Martin指出的那样,在示例代码或URL中省略“/”将使签名“无效”。