因此,在使用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>
有没有人了解解决此问题的正确方法?
答案 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等),这是一个设计决定而且不会改变。