0

因此,在使用 Django-Piston 实现 OAuth 时,我遇到了这里提到的错误:“无效签名”:oAuth provider with Django-piston

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

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

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

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

4

2 回答 2

0

如果我在这里做出了正确的决定,那就是我对活塞的修复:在 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])
于 2012-06-24T21:26:09.600 回答
0

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

于 2012-06-25T14:20:54.337 回答