2013-04-02 31 views
2

我一直在使用netflix api和python oauth2库的受保护身份验证。但是,在签名请求方面,我没有问题,允许用户使用他们的netflix帐户登录,当我尝试获取access_token时遇到了一些问题,我知道有些情况下OAuth不返回verifier,即使它应该从netflix的授权页面重定向后,我会得到类似如下的结果:http://127.0.0.1:5000/authorized_user?oauth_token=some_token&oauth_verifier=验证器为空。oauth2库和Netflix API返回无访问令牌

我是图书馆的新手,很不明白verfier不存在时该怎么办。因为我成功将用户重定向到netflix登录/授权页面。我认为我的错误来自我完全不了解的这一步骤。以下是我尝试的简化(shell)版本。我会很高兴向正确的方向推进,我阅读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'] 

回答

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公司没有提及他们的文档中的验证者。所以我猜这就是为什么你看不到。其次,他们正在返回一个“授权”请求令牌。基本上这个令牌取代了他们流程中的验证者引脚。

希望这会有所帮助!

+0

非常感谢 - 我遵循了您的建议,并且遇到了一个问题,netflix要求您提交带有authorize_url的'oauth_consumer_key'。由于这是他们的要求,在使用你的库时,我从服务器得到一个400响应,说' oauth_consumer_key缺少'。另外,我想说你的库很好用,并且消除了其他库所暴露的复杂性。让我知道任何建议来解决这个问题。再次感谢。 – lv10

+0

对于authorize_url,你可以将任何你想要的参数传递给函数调用,这些参数将被添加到查询字符串中,所以也许这样会起作用:'netflix.get_authorize_url(request_token,** {'oauth_consumer_key':'123 ',...})'。希望能帮助和谢谢你的客气话! – maxcountryman

+0

再次感谢。我设法现在从shell中开始工作。但是,当我从Web框架(Flask)执行它时,我一直得到以下错误:引发''KeyError(PROCESS_TOKEN_ERROR.format(key = bad_key,raw = r.content))''。我不太了解keyError的含义? – lv10