2013-04-02 38 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