Java “;无效签名”;:使用Scribe作为客户端重新访问带有Django活塞的oAuth提供程序

Java “;无效签名”;:使用Scribe作为客户端重新访问带有Django活塞的oAuth提供程序,java,django,oauth,scribe,django-piston,Java,Django,Oauth,Scribe,Django Piston,因此,在使用Django活塞实现OAuth时,我遇到了这里提到的错误: 之前发布的解决方案对我不起作用,所以我开始深入研究活塞()和划线() 事实证明,当使用JSON字符串负载对Scribe请求进行签名时,实际上只对OAuth参数进行签名。这会导致活塞签名验证失败,因为活塞对有效负载中除OAuth参数外的所有参数进行签名 我能够修改活塞,只签署OAuth参数,现在一切正常。作为OAuth的新成员,我不确定是否是正确的修复方法,一种替代方法是修改Scribe以对有效负载内容进行签名(或者可能在有效

因此,在使用Django活塞实现OAuth时,我遇到了这里提到的错误:

之前发布的解决方案对我不起作用,所以我开始深入研究活塞()和划线()

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

我能够修改活塞,只签署OAuth参数,现在一切正常。作为OAuth的新成员,我不确定是否是正确的修复方法,一种替代方法是修改Scribe以对有效负载内容进行签名(或者可能在有效负载中附加每个参数,而不是将其作为字符串附加)


有人知道解决这个问题的正确方法吗?

如果我做出了正确的决定,这里是我对活塞的修复方法: 在类OAuthRequest(对象)中添加此方法:

    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])

OAuth规范没有说明任何关于有效负载的内容(不是参数)。一些供应商确实签署了协议,但这取决于他们。在Scribe中不签署正文内容(xml、json等),这是一个设计决策,不会改变