Ошибка неверной подписи при попытке сгенерировать токен запроса в oauth-провайдере Pyramid - PullRequest
1 голос
/ 11 июля 2011

Я пытаюсь сгенерировать токен запроса, используя oauth2 в приложении Pyramid для управления доступом к разрабатываемому API.Я застрял, пытаясь проверить мой потребительский ключ и секрет, работая с этого примера .На конечной точке 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 и secret для заданного key.)

На стороне потребителя, снова после сообщения в блоге, упомянутого ранее, я делаю следующее:

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 немного схематична в документации по этому вопросу, и большинство примеров, похоже, направлены на реализацию потребителей, а не на создание провайдеров.

Спасибо!

Обновление Отвечая на мой собственный вопрос, чтобы дать то, что я считаю ответом.Из этого отчета об ошибке для oauth2 может показаться, что включение параметра oauth_body_hash испортило мою проверку подписи, так как я использовал GET.Изменение на POST решило проблему.Странно, что это все равно произойдет, учитывая, что я также тестирую с этой библиотекой.

И, отвечая на вторую часть, я полагаю, что вы можете просто сгенерировать любую пару ключ / секрет, которая является случайнойи достаточно долго.Я видел, как люди разделяли хэши sha1 некоторого случайного источника на две части по 20 символов.Затем вы можете oauth2.Token автоматически создать URL-адрес, который вы затем сможете использовать на своем authorize_token шаге.

Конечно, если я ошибаюсь, обязательно сообщите мне.

1 Ответ

1 голос
/ 27 января 2012

Это похоже на проблему, с которой я столкнулся, но я нашел другое (возможное) решение.

Похоже, что все параметры строки запроса включаются дважды, что описано в этом сообщении об ошибке: https://github.com/simplegeo/python-oauth2/issues/21

Удаление параметров строки запроса, поскольку описанная проблема устранила ее для меня.

...