2011-08-26 3 views
4

사용자의 Google 캘린더 피드를 읽는 Python 애플리케이션을 oAuth 1에서 oAuth 2로 마이그레이션하려고합니다. OAuth를 1로Python gdata 및 oAuth 2를 사용하여 캘린더에 인증

  • : 브라우저를 열 것 내 응용 프로그램은 사용자가 자신의 Gmail 계정 인증 및 액세스 권한을 부여하고, 내 응용 프로그램이 user_token를 취득 할 수 있었다, 해당 사용자에 대한 user_secret은 다음 일정에 인증 피드 :

    client = gdata.calendar.client.CalendarClient(source='test') 
    client.auth_token = gdata.gauth.OAuthHmacToken(app_key, 
         app_secret,user_token,user_secret,gdata.gauth.ACCESS_TOKEN) 
    

이 토큰 비밀 쌍 오래 살았 될 것이다. OAuth를 2로

: 나는 여기에 지정된 gauth.py 패치를 적용했다.

여기에 게시 된 코드로 조금 놀았습니다 http://codereview.appspot.com/4440067/ 괜찮습니다.

내 질문 : - 난 access_token이 취득하고

, 내 응용 프로그램에서 컬 호출을 통해 refresh_token도, 나는 성공적으로 모두를 검색 할 수 있습니다. 내가 에이 코드를 적용 그러나 :

token = 
    gdata.gauth.OAuth2Token(client_id=client_id,client_secret=client_secret', 
          scope='https://www.google.com/calendar/ 
    feeds',user_agent='calendar-cmdline-sample/1.0') 
    uri = token.generate_authorize_url() 
    token.get_access_token(access_token) 

그것은 저를 준다 : 나는 성공적으로 위의 작업을 수행 할 수 있습니다

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/Library/Python/2.6/site-packages/gdata/gauth.py", line 1267, 
in get_access_token 
    raise OAuth2AccessTokenError(error_msg) 
gdata.gauth.OAuth2AccessTokenError 

-Assuming, 나는이 DB에 액세스/새로 고침 토큰을 절약 할 수 있습니다. 파이썬 gdata lib를 사용하여 refresh_token을 사용하여 다른 access_token을 요청하려면 어떻게해야합니까? (따라서 사용자가 앱을 사용할 때마다 액세스 권한을 요청할 필요가 없습니다)

미리 감사드립니다.

M

답변

1

Marchie,

나는 당신의 스택 트레이스의 나머지 부분을 볼 수 없지만, 전반적인 문제를 해결할 해당 솔루션을 세 가지 특정 문제를 제공 할 수 있습니다.

문제점 I : 값 redirect_uri이 개체에 설정되어 있지 않습니다. 요청의 몸 get_access_token에 지정된 방법

참고 :

이것은 redirect_uri 속성이 원래 generate_authorize_url에서 설정 한 값으로 개체에 설정되는에 따라
body = urllib.urlencode({ 
    'grant_type': 'authorization_code', 
    'client_id': self.client_id, 
    'client_secret': self.client_secret, 
    'code': code, 
    'redirect_uri': self.redirect_uri, 
    'scope': self.scope 
    }) 

.그래서,

token = gdata.gauth.OAuth2Token(...) 

를 호출하여 토큰을 재구성 한 후 당신은 단순히 리디렉션 URI 설정해야합니다 :

token.redirect_uri = 'http://path/that/you/set' 

문제 II : redirect_uri의 기본값은 잘못 (더 구체적으로, 사용되지 않음) .

인수가없는 generate_authorize_url을 호출 했으므로 redirect_uri의 기본값 (현재 oob)이 사용되었습니다. OAuth 2.0 docs 상태 인 경우 oob은 지원되는 값 (지원되지 않음) 중 하나가 아닙니다.

당신이 참으로 설치된 응용 프로그램을 사용하는 경우, 대신 또한

token.redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' 

, 초기 토큰을 얻을 수 generate_authorize_url를 호출 할 때, 당신은 키워드로 사용해야합니다으로 설정해야합니다 매개 변수

url = token.generate_authorize_url(redirect_uri='urn:ietf:wg:oauth:2.0:oob') 

문제 III : 당신은 잘못된 값으로 get_access_token을 요구하고있다 (또한 당신의 코드에서 인스턴스화되지 않은 하나).

이 코드는 승인 후받은 코드의 문자열 값 또는 'code'을 키로 사용하여 호출해야합니다.

는 다음을 통해 수행 할 수 있습니다

import atom.http_core 

# Page the user is redirected to after authorizing 
redirected_page = 'http://path/that/you/set?code=RANDOM-CODE' 
uri = atom.http_core.ParseUri(redirected_page) 

# uri.query is a dictionary with the query string as key, value pairs 
token.get_access_token(uri.query) 

포스트 스크립트 다음 patch의 저자는 또한 패치 사용에 대한 blog post을 발표했다. (generate_authorize_url 함수에서 redirect_uri 대신 키워드 redirect_url이 사용 된 경우 게시물에 오타가 있음을 유의하십시오.

관련 문제