Я пытаюсь сгенерировать токен запроса, используя 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
шаге.
Конечно, если я ошибаюсь, обязательно сообщите мне.