【发布时间】:2011-07-10 23:01:53
【问题描述】:
我正在尝试在 Pyramid 应用程序中使用 oauth2 生成请求令牌,以控制对我正在开发的 API 的访问。我一直在尝试验证来自this example 的消费者密钥和秘密工作。在 Pyramid request_token 端点上,我有以下内容:
@view_config(route_name = "api_request_token", request_method = "GET")
def api_request_token(request):
auth_header = {}
if ('Authorization' in request.headers):
auth_header = {'Authorization': request.headers['Authorization']}
req = oauth2.Request.from_request(
request.method,
request.url,
headers = auth_header,
query_string = request.query_string)
try:
oauth_server.verify_request(req, ConsumerKeySecret.getByConsumerKey(request.params.get('oauth_consumer_key')), None)
except oauth2.Error, e:
print e
except KeyError, e:
print e
except Exception, e:
print e
(ConsumerKeySecret.getByConsumerKey 是一个 SQLAlchemy 模型类方法,它为给定的 key 设置 key 和 secret 的实例变量。)
在消费者方面,再次按照前面提到的博客文章,我正在做以下事情:
def build_request(url, method='GET'):
params = {
'oauth_version': "1.0",
'oauth_nonce': oauth2.generate_nonce(),
'oauth_timestamp': int(time.time()),
'oauth_signature_method': 'HMAC-SHA1',
}
consumer = oauth2.Consumer(key='b9085cb942dc427c92dd', secret='1735fd5b090381dcaf57')
params['oauth_consumer_key'] = consumer.key
req = oauth2.Request(method=method, url=url, parameters=params)
signature_method = oauth2.SignatureMethod_HMAC_SHA1()
req.sign_request(signature_method, consumer, None)
return req
request = build_request("http://localhost:6543/api/01/request_token")
u = urllib2.urlopen(request.to_url())
验证失败,但出现以下错误:
Invalid signature. Expected signature base string: GET&http%3A%2F%2Flocalhost%3A6543%2Fapi%2F01%2Frequest_token&oauth_body_hash%3D2jmj7l5rSw0yVb%252FvlWAYkK%252FYBwk%253D%26oauth_body_hash%3D2jmj7l5rSw0yVb%252FvlWAYkK%252FYBwk%253D%26oauth_consumer_key%3Db9085cb942dc427c92dd%26oauth_consumer_key%3Db9085cb942dc427c92dd%26oauth_nonce%3D42023151%26oauth_nonce%3D42023151%26oauth_signature_method%3DHMAC-SHA1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1310338562%26oauth_timestamp%3D1310338562%26oauth_version%3D1.0%26oauth_version%3D1.0
我在这里感到困惑,因为每个查询字符串参数在“预期”签名中出现两次。可能出了什么问题?
如果这是一个容易回答的问题,我会跟进:一旦我实际验证了请求,如何生成请求令牌? oauth2 库在有关这一点的文档中略显粗略,并且大多数示例似乎都旨在实现消费者,而不是创建提供者。
谢谢!
更新 回答我自己的问题,给出我认为的答案。从这个bug report 到oauth2,似乎包含oauth_body_hash 参数会扰乱我的签名验证,因为我使用的是GET。将其更改为POST 解决了问题。奇怪的是,考虑到我也在用这个库测试,这无论如何都会发生。
为了回答第二部分,我相信您可以生成任何随机且足够长的密钥/秘密对。我见过人们将一些随机源的 sha1 散列分成两个 20 个字符的部分。然后,您可以通过我们 oauth2.Token 自动创建您可以在您的 authorize_token 步骤中使用的 URL。
当然,如果我在这方面有任何错误,请务必告诉我。
【问题讨论】:
标签: python oauth provider pyramid consumer