2013-04-02 4 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 로그인/승인 페이지로 성공적으로 리디렉션합니다. 나는 나의 잘못이 내가 완전히 이해하지 못하는이 단계에서 온다고 가정한다. 아래는 내가 시도하고있는 단순화 된 (셸) 버전입니다. 나는 옳은 방향으로 밀고 나가기를 바랄 것입니다. 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을 추천 할 수 있습니다. 나는 그것이 가치있는 것을 위해, 속임수의 관리자입니다.

이제 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 

몇 가지 여기서주의해야 할이 : 넷플릭스는 문서의 검증에 대한 언급을하지 않습니다. 그래서 나는 그것이 당신이 아무 것도 보지 않는 이유라고 생각하고 있습니다. 두 번째로 "승인 된"요청 토큰을 제자리에 반환합니다. 기본적으로,이 토큰은, 플로우의 검증 자 핀을 옮겨 놓습니다.

희망이 도움이됩니다.

+0

대단히 감사합니다. 귀하의 권장 사항을 따르고 문제가 발생했습니다. netflix에서는 authorize_url과 함께 oauth_consumer_key를 제출해야합니다. 이 요구 사항이 있기 때문에 라이브러리를 사용하는 동안' oauth_consumer_key is missing'이라는 서버가 400 응답 양식을받습니다. 또한 라이브러리가 훌륭하게 작동하고 다른 라이브러리에 의해 노출 된 복잡성이 제거됩니다. 이 문제를 극복하기위한 제안을 알려주십시오. 다시 한번 감사드립니다. – lv10

+0

authorize_url의 경우 함수 호출에 필요한 매개 변수를 전달할 수 있으며 이러한 매개 변수가 쿼리 문자열에 추가되므로 다음과 같이 작동 할 수 있습니다.'netflix.get_authorize_url (request_token, ** { 'oauth_consumer_key': '123 ', ...})'. 희망이 친절한 단어에 도움과 감사합니다! – maxcountryman

+0

다시 한번 감사드립니다. 나는 쉘에서 이제 작동하도록 만들었습니다. 그러나 웹 프레임 워크 (Flask)에서 다음과 같은 오류가 계속 발생합니다. KeyError (PROCESS_TOKEN_ERROR.format (key = bad_key, raw = r.content))를 발생시킵니다. 나는 keyError가 의미하는 것을 정말로 이해하지 못합니까? – lv10

관련 문제