Skip to main content
 首页 » 编程设计

python之oauth2 库和 Netflix API 返回 None 访问 token

2025年05月04日11bhlsheji

我一直在使用 netflix api 和 python oauth2 库的 protected 身份验证。我在发出签名请求时没有问题,但是,为了允许用户使用他们的 netflix 帐户登录,我在尝试获取 access_token 时遇到了一些问题,我知道在某些情况下 OAuth 不会返回 verifier,即使它应该是,但是在从 netflix 的授权页面重定向后我得到这样的东西:http://127.0.0.1:5000/authorized_user?oauth_token=some_token&oauth_verifier= 验证器为空。

我是这个库的新手,完全不明白当 verfier 不存在时该怎么办。因为,我成功地将用户重定向到 netflix 登录/授权页面。我认为我的错误来 self 不完全理解的这一步。下面是我正在尝试的简化(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'] 

请您参考如下方法:

所以听起来您正在尝试使用 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 在其文档中没有提及验证器。所以我猜这就是为什么你什么都看不到的原因。其次,他们正在返回一个“授权”的请求 token 。基本上这个 token 取代了他们流程中的验证者 pin。

希望这对您有所帮助!