“无效签名”:使用Scribe作为客户端重新访问Django-piston的oAuth提供程序

时间:2012-06-24 21:20:46

标签: java django oauth scribe django-piston

因此,在使用Django-Piston完成OAuth的实现时,我遇到了错误:"Invalid signature": oAuth provider with Django-piston

之前发布的解决方案对我不起作用,所以我开始深入研究活塞(https://bitbucket.org/jespern/django-piston/overview)和Scribe(https://github.com/fernandezpablo85/scribe-java)。

事实证明,在使用JSON字符串有效负载签署Scribe请求时,实际上只签署了OAuth参数。这会导致活塞失败签名验证,因为除了OAuth参数外,活塞还会记录有效负载中的所有参数。

我能够修改Piston只签署OAuth参数,现在一切正常。作为OAuth的新手,我不确定这是否是正确的修复方法,另一种方法是修改Scribe以对有效负载内容进行签名(或者将每个参数附加到有效负载中而不是将其作为字符串附加)。 / p>

有没有人了解解决此问题的正确方法?

2 个答案:

答案 0 :(得分:0)

如果我在这里做出了正确的决定,那么我对Piston的解决方案是: 在类OAuthRequest(object)中添加此方法:

    def get_oauth_parameters(self):
    """Get any OAuth parameters."""
    parameters = {}
    for k, v in self.parameters.iteritems():
        # Ignore oauth parameters.
        if k.find('oauth_') > -1:
            parameters[k] = v
    return parameters

并修改此方法以调用新方法:

    def get_normalized_parameters(self):
    """Return a string that contains the parameters that must be signed."""
    params = self.get_oauth_parameters()
    try:
        # Exclude the signature if it exists.
        del params['oauth_signature']
    except:
        pass
    # Escape key values before sorting.
    key_values = [(escape(_utf8_str(k)), escape(_utf8_str(v))) \
        for k,v in params.items()]
    # Sort lexicographically, first after key, then after value.
    key_values.sort()
    # Combine key value pairs into a string.
    return '&'.join(['%s=%s' % (k, v) for k, v in key_values])

答案 1 :(得分:0)

OAuth规范没有说明有效负载(不是参数)。有些提供商会签名,但这取决于他们。在Scribe中没有签署正文内容(xml,json等),这是一个设计决定而且不会改变。