Библиотека oauth2 и API Netflix не возвращают токен доступа

Я работал с защищенной аутентификацией API-интерфейса netflix и библиотеки oauth2 python. Однако у меня нет проблем с подписанными запросами, чтобы позволить пользователям входить в систему, используя свои учетные записи netflix, я сталкиваюсь с несколькими проблемами, когда пытаюсь получить access_token, я знаю случаи, когда OAuth не возвращает verifier, даже если так и должно быть, однако после перенаправления со страницы авторизации netflix я получаю что-то вроде этого: http://127.0.0.1:5000/authorized_user?oauth_token=some_token&oauth_verifier= с пустым верификатором.

Я новичок в библиотеке и совсем не понял, что делать, когда verfier нет. Так как я успешно перенаправляю пользователя на страницу входа/авторизации netflix. Я предполагаю, что моя ошибка связана с этим шагом, который я не совсем понимаю. Ниже приведена упрощенная (оболочка) версия того, что я пытаюсь сделать. Я был бы признателен за толчок в правильном направлении, я прочитал документацию netflix и прочитал документацию библиотеки, но не мог понять, что делать.

# Get request token (temporary)
resp, content = client.request(REQUEST_TOKEN_URL, "GET")

if resp['status'] != '200':
    raise Exception("Invalid response %s." % resp['status'])

request_token = dict(parse_qsl(content))

print 'Request token'
print  '  --> oauth_token          =  %s' % request_token['oauth_token']
print  '  --> oauth_token_secret   =  %s' % request_token['oauth_token_secret']
print  '  --> login_url            =  %s' % request_token['login_url']

# Redirect to netflix for user authorization

print 'Go to the following link: '
login_url = request_token['login_url']
access_token_url = '%s&oauth_consumer_key=%s' % (login_url, CONSUMER_KEY)

accepted = 'n'
while accepted.lower() == 'n':
    accepted = raw_input('Have you authorized me? (y/n) ')

resp, content = client.request(access_token_url, "POST")

token = oauth.Token(request_token['oauth_token'],
                    request_token['oauth_token_secret'])

client = oauth.Client(consumer, token)

resp, content = client.request(access_token_url, "POST")
access_token = dict(parse_qsl(content))

print "Access Token:"
print "    - oauth_token        = %s" % access_token['oauth_token']
print "    - oauth_token_secret = %s" % access_token['oauth_token_secret']

person lv10    schedule 02.04.2013    source источник


Ответы (1)


Похоже, вы пытаетесь использовать python-oauth2. К сожалению, эта библиотека считается заброшенной. Я настоятельно рекомендую использовать поддерживаемую библиотеку. Для этого я могу порекомендовать rauth. Я поддерживаю rauth, чего бы это ни стоило.

Теперь, к сожалению, Netflix не принимает новые приложения в свою инфраструктуру OAuth. Однако я написал для вас пример, который можно попробовать, если вы готовы попробовать. Я не могу обещать, что это не будет работать без некоторых настроек, но вот оно:

from rauth import OAuth1Service

import re
import webbrowser

request_token_url = 'http://api-public.netflix.com/oauth/request_token'
access_token_url = 'http://api-public.netflix.com/oauth/access_token'
authorize_url = 'https://api-user.netflix.com/oauth/login'
base_url = 'http://api-public.netflix.com/'

netflix = OAuth1Service(consumer_key='123',
                        consumer_secret='456',
                        request_token_url=request_token_url,
                        authorize_url=authorize_url,
                        access_token_url=access_token_url,
                        base_url=base_url)

request_token, request_token_secret = netflix.get_request_token()

oauth_callback = 'http://example.com/oauth/authorized'

params = {'oauth_callback': oauth_callback, 'application_name': 'your_app'}
authed_url = netflix.get_authorize_url(request_token, **params)

print 'Visit this URL in your browser: ' + authed_url
webbrowser.open(authed_url)

url_with_token = raw_input('Copy URL from your browser\'s address bar: ')
request_token = re.search('\?oauth_token=([^&]*)', url_with_token).group(1)

s = netflix.get_auth_session(request_token, request_token_secret)

r = s.get('users/current')
print r.content

Здесь следует отметить пару вещей: Netflix не упоминает верификатор в своей документации. Я предполагаю, что именно поэтому вы ничего не видите. Во-вторых, они возвращают «авторизованный» токен запроса на месте. По сути, этот токен заменяет пин-код верификатора в их потоке.

Надеюсь это поможет!

person maxcountryman    schedule 02.04.2013
comment
Большое спасибо - я последовал вашим рекомендациям и столкнулся с проблемой, netflix требует, чтобы вы отправили свой oauth_consumer_key с авторизацией_url. Поскольку это их требование, при использовании вашей библиотеки я получаю от сервера ответ 400, говорящий <message>oauth_consumer_key is missing</message>. Кроме того, я хотел сказать, что ваша библиотека отлично работает и устраняет сложности, присущие другим библиотекам. Дайте мне знать любое предложение, чтобы преодолеть эту проблему. Спасибо еще раз. - person lv10; 03.04.2013
comment
Для authorize_url вы можете передать любые параметры, которые вы хотите, для вызова функции, и эти параметры будут добавлены в строку запроса, поэтому, возможно, сработает что-то вроде этого: netflix.get_authorize_url(request_token, **{'oauth_consumer_key': '123', ...}). Надеюсь, что это поможет и спасибо за добрые слова! - person maxcountryman; 03.04.2013
comment
Спасибо еще раз. Мне удалось заставить его работать из оболочки. Однако, когда я делаю это из веб-фреймворка (Flask), я продолжаю получать следующую ошибку: поднять ` KeyError(PROCESS_TOKEN_ERROR.format(key=bad_key, raw=r.content)). Я не очень понимаю, что означает keyError? - person lv10; 04.04.2013
comment
Это может означать, что формат, предоставленный Netflix, не был автоматически декодирован rauth (он ожидает ответа в закодированной форме, но некоторые провайдеры отличаются). Таким образом, вы можете передать произвольную функцию декодера для декодирования ответа, например. s = netflix.get_auth_session(request_token, request_token_secret, decoder=json.loads). В случае, если это не сработает, было бы полезно увидеть полную трассировку. Также не стесняйтесь открывать вопрос на Github. - person maxcountryman; 04.04.2013
comment
Извините за поздний ответ. Я завершал другие проекты. Я этого не сделал после того, как попробовал decoder=json.loads(), я тоже не смог заставить его работать. Я создам вопрос на github. Спасибо. - person lv10; 12.04.2013
comment
Исправил ошибку, она была на моей стороне. Ваша библиотека работает отлично. Еще раз большое спасибо. - person lv10; 12.04.2013