Python oauth2库和Netflix API返回无访问令牌

Python oauth2库和Netflix API返回无访问令牌,python,rest,oauth,netflix,Python,Rest,Oauth,Netflix,我一直在使用netflix api和python oauth2库的受保护身份验证。我提出签名请求没有问题,但是,为了允许用户使用他们的netflix帐户登录,我在尝试获取访问令牌时遇到了一些问题,我知道在某些情况下OAuth不会返回验证器,即使它应该返回,然而,在从netflix的授权页面重定向后,我得到了如下信息:http://127.0.0.1:5000/authorized_user?oauth_token=some_token&oauth_verifier=验证程序为空 我是图书馆的新手

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

我是图书馆的新手,不知道当
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']

因此,听起来您正在尝试使用python-oauth2。不幸的是,这个图书馆被广泛认为是废弃的。我强烈建议使用维护过的库。因此我可以推荐。我是劳思的维护者,不管它值多少钱

现在不幸的是,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在文档中没有提到验证器。所以我猜这就是为什么你看不到。其次,他们返回一个“已授权”的请求令牌。基本上,此令牌将替换其流中的验证器pin


希望这有帮助

非常感谢-我遵循了您的建议,遇到了一个问题,netflix要求您使用authorize\u url提交您的
oauth\u consumer\u密钥。由于这是他们的一个要求,在使用您的库时,我从服务器得到一个400的响应,说
oauth\u consumer\u密钥丢失了
。此外,我想说的是,您的库工作得非常好,消除了其他lib暴露的复杂性。让我知道任何克服这个问题的建议。再次感谢。对于authorize_url,您可以将任何想要的参数传递给函数调用,这些参数将添加到查询字符串中,因此类似的操作可能会起作用:
netflix.get_authorize_url(请求令牌,**{oauth_consumer_key':'123',…})
。希望对你有所帮助,谢谢你的好话!再次感谢。我设法使它现在从外壳开始工作。但是,当我在web框架(Flask)中执行此操作时,我不断得到以下错误:raise`
keyrorm(PROCESS\u TOKEN\u error.format(key=bad\u key,raw=r.content))
。我真的不明白keyError是什么意思?这可能意味着Netflix提供的格式不能被rauth自动解码(它需要一个表单编码的响应,但一些提供商不同)。因此,您可以传入任意解码器函数来解码响应,例如
s=netflix.get\u auth\u会话(request\u token,request\u token\u secret,decoder=json.loads)
。如果这不起作用,那么查看完整的回溯将很有帮助。也可以在Github上随意打开一个问题。很抱歉响应太晚。我一直在完成其他项目。在尝试了
decoder=json.loads()
之后,我也无法让它工作。我将在github上创建一个问题。谢谢