python - 尝试在 Pyramid oauth 提供程序中生成请求 token 时出现无效签名错误

标签 python oauth provider pyramid consumer

我正在尝试使用 oauth2 生成请求 token 在 Pyramid 应用程序中,用于控制对我正在开发的 API 的访问。我一直在尝试验证我的消费者 key 和 secret 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 设置实例变量 secretkey 。)

在消费者方面,再次按照前面提到的博客文章,我正在执行以下操作:

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

但是,我在这里感到困惑,因为每个查询字符串参数在“预期”签名中出现两次。可能出了什么问题?

如果这是一个容易回答的问题,我有一个后续问题:一旦我实际验证了请求,我如何生成请求 token ? oauth2库在这一点上的文档有点粗略,大多数示例似乎都是面向实现消费者,而不是创建提供者。

谢谢!

更新回答我自己的问题,给出我认为的答案。从这里bug report对于 oauth2 ,看来包含 oauth_body_hash因为我使用 GET ,所以参数搞乱了我的签名验证。将其更改为 POST解决了问题。奇怪的是,鉴于我也在使用这个库进行测试,无论如何都会发生这种情况。

为了回答第二部分,我相信您可以生成任何随机且足够长的 key / secret 对。我见过人们将一些随机源的 sha1 哈希值分成两个 20 个字符的部分。您可以联系我们oauth2.Token自动创建您可以在 authorize_token 中使用的 URL步骤。

当然,如果我在其中有任何错误,请务必让我知道。

最佳答案

这听起来和我遇到的问题一模一样,但我找到了一个不同的(可能的)解决方案。

看起来所有查询字符串参数都被包含两次,此错误报告中对此进行了描述:https://github.com/simplegeo/python-oauth2/issues/21

按照所描述的问题删除查询字符串参数为我解决了这个问题。

关于python - 尝试在 Pyramid oauth 提供程序中生成请求 token 时出现无效签名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6644308/

相关文章:

java - 将 XML 位图数据转换为图像

python - 运行开发服务器时,Bottle 框架的线程之一出现 OSError

Symfony2 ACL - 无法在单个提供商上设置多个用户源

c++ - Windows 8 拼写检查提供程序

Flutter 使用 ProxyProvider

python - Django,导入错误: cannot import name Celery

python - python 中 range() 参数的顺序

asp.net - 127.0.0.1 此站点无法提供安全连接

google-app-engine - 在没有用户登录的情况下授权谷歌云端点 API 访问

oauth - Google API OAuth2,服务帐户, "error": "invalid_grant"