【问题标题】:oauth2 library and Netflix API return None access tokenoauth2 库和 Netflix API 返回无访问令牌
【发布时间】:2013-03-23 06:51:12
【问题描述】:

我一直在使用 netflix api 和 python oauth2 库的受保护身份验证。我发出签名请求没有问题,但是,为了允许用户使用他们的 netflix 帐户登录,当我尝试获取 access_token 时遇到了一些问题,我知道在某些情况下 OAuth 不返回 @987654321 @,即使它应该是,但是在从 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 rest oauth netflix


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

    希望这会有所帮助!

    【讨论】:

    • 非常感谢 - 我已按照您的建议进行操作,但遇到了一个问题,netflix 要求您提交带有 authorize_url 的 oauth_consumer_key。由于这是他们的要求,因此在使用您的库时,我从服务器收到 400 响应说<message>oauth_consumer_key is missing</message>。此外,我想说您的库运行良好,并消除了其他库所暴露的复杂性。让我知道解决此问题的任何建议。再次感谢。
    • 对于 authorize_url,你可以将任何你想要的参数传递给函数调用,这些参数将被添加到查询字符串中,所以也许这样的事情会起作用:netflix.get_authorize_url(request_token, **{'oauth_consumer_key': '123', ...})。希望对您有所帮助,并感谢您的客气话!
    • 再次感谢。我设法让它现在从 shell 工作。但是,当我从 Web 框架(Flask)执行此操作时,我不断收到以下错误:raise `KeyError(PROCESS_TOKEN_ERROR.format(key=bad_key, raw=r.content))。我真的不明白 keyError 是什么意思?
    • 这可能意味着 Netflix 提供的格式不能被 rauth 自动解码(它需要一个表单编码的响应,但一些提供商会有所不同)。因此,您可以传入任意解码器函数来解码响应,例如s = netflix.get_auth_session(request_token, request_token_secret, decoder=json.loads)。如果这不起作用,查看完整的回溯会很有帮助。也可以在 Github 上打开一个问题。
    • 抱歉回复晚了。我一直在完成其他项目。在尝试了decoder=json.loads() 之后我也没有成功。我将在 github 上创建一个问题。谢谢。
    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2020-12-05
    • 2017-11-14
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多