2011-07-27 67 views
0

我試圖讓OAuth在一個小的Python腳本中工作。我正在使用python-oauth2,我正在嘗試連接到Google以列出我的Google文檔。Google OAuth問題:invalid_signature

獲取請求令牌並授權令牌似乎工作正常,但每當我嘗試獲取訪問令牌時,都會收到HTTP 400響應,並且響應內容爲「signature_invalid」。

這裏是我的代碼:

import httplib2, os, sys, tempfile, urllib, urlparse 
import oauth2 as oauth 
#httplib2.debuglevel=1 

# this php script writes oauth_verifier to /tmp/verifier.txt 
oauth_callback = 'http://localhost/api.php' 

scope = 'https://docs.google.com/feeds/' 
xoauth_displayname = 'Adam\'s API Test' 
url = 'https://www.google.com/accounts/OAuthGetRequestToken?scope=%s&oauth_callback=%s&xoauth_displayname=%s' % (scope, oauth_callback, xoauth_displayname) 

######## OAUTH: GET REQUEST TOKEN ############# 
consumer = oauth.Consumer('anonymous','anonymous') 
client = oauth.Client(consumer) 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'OAuthGetRequestToken OK' 
else: 
    print 'OAuthGetRequestToken status: %s' % resp['status'] 
    print content 
    sys.exit(1) 

######## OAUTH: AUTHORIZE TOKEN ############### 
oauth_token = urlparse.parse_qs(content)['oauth_token'][0] 
url = 'https://www.google.com/accounts/OAuthAuthorizeToken?hd=default&oauth_token=%s' % urllib.quote_plus(oauth_token) 
print 'Visit this URL in your browser: %s' % url 
raw_input('Press ENTER once you have granted access...') 

######## OAUTH: GET ACCESS TOKEN ############## 
verifier = file('/tmp/verifier.txt').read().rstrip() 
url = 'https://www.google.com/accounts/OAuthGetAccessToken?oauth_token=%s&oauth_verifier=%s' % (oauth_token, verifier) 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'OAuthGetAccessToken OK' 
    print content 
else: 
    print 'OAuthGetAccessToken status: %s' % resp['status'] 
    print content 
    sys.exit(1) 

任何想法?

回答

1

隨着伊娃的幫助,我修好了! This post had the solution

我未能利用oauth_token_secret,原始請求返回未經授權的令牌。我錯過了Consumer正在被重用,但在Twitter Three-legged OAuth Example in the python-oauth2 README的末尾正在實例化新的Client訪問令牌獲取。

這裏是修復以上代碼的補丁:

--- old.py 2011-07-28 10:38:06.904639958 -0500 
+++ new.py 2011-07-28 10:38:44.192639954 -0500 
@@ -22,6 +22,7 @@ 

######## OAUTH: AUTHORIZE TOKEN ############### 
oauth_token = urlparse.parse_qs(content)['oauth_token'][0] 
+oauth_token_secret = urlparse.parse_qs(content)['oauth_token_secret'][0] 
url = 'https://www.google.com/accounts/OAuthAuthorizeToken?hd=default&oauth_token=%s' % urllib.quote_plus(oauth_token) 
print 'Visit this URL in your browser: %s' % url 
raw_input('Press ENTER once you have granted access...') 
@@ -29,6 +30,7 @@ 
######## OAUTH: GET ACCESS TOKEN ############## 
verifier = file('/tmp/verifier.txt').read().rstrip() 
url = 'https://www.google.com/accounts/OAuthGetAccessToken?oauth_token=%s&oauth_verifier=%s' % (oauth_token, verifier) 
+client.token = oauth.Token(oauth_token, oauth_token_secret) 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'OAuthGetAccessToken OK' 

而這裏的原代碼,與該補丁適用於:

import httplib2, os, sys, tempfile, urllib, urlparse 
import oauth2 as oauth 
#httplib2.debuglevel=1 

# this php script writes oauth_verifier to /tmp/verifier.txt 
oauth_callback = 'http://localhost/api.php' 

scope = 'https://docs.google.com/feeds/' 
xoauth_displayname = 'Adam\'s API Test' 
url = 'https://www.google.com/accounts/OAuthGetRequestToken?scope=%s&oauth_callback=%s&xoauth_displayname=%s' % (scope, oauth_callback, xoauth_displayname) 

######## OAUTH: GET REQUEST TOKEN ############# 
consumer = oauth.Consumer('anonymous','anonymous') 
client = oauth.Client(consumer) 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'OAuthGetRequestToken OK' 
else: 
    print 'OAuthGetRequestToken status: %s' % resp['status'] 
    print content 
    sys.exit(1) 

######## OAUTH: AUTHORIZE TOKEN ############### 
oauth_token = urlparse.parse_qs(content)['oauth_token'][0] 
oauth_token_secret = urlparse.parse_qs(content)['oauth_token_secret'][0] 
url = 'https://www.google.com/accounts/OAuthAuthorizeToken?hd=default&oauth_token=%s' % urllib.quote_plus(oauth_token) 
print 'Visit this URL in your browser: %s' % url 
raw_input('Press ENTER once you have granted access...') 

######## OAUTH: GET ACCESS TOKEN ############## 
verifier = file('/tmp/verifier.txt').read().rstrip() 
url = 'https://www.google.com/accounts/OAuthGetAccessToken?oauth_token=%s&oauth_verifier=%s' % (oauth_token, verifier) 
client.token = oauth.Token(oauth_token, oauth_token_secret) 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'OAuthGetAccessToken OK' 
    print content 
else: 
    print 'OAuthGetAccessToken status: %s' % resp['status'] 
    print content 
    sys.exit(1) 

需要注意的是,實際上,oauth_tokenoauth_verifier不需要手動添加到查詢字符串以獲取訪問令牌(python-oauth2爲我們做這件事)。我將代碼保持原樣,以便我可以說明從原始帖子中的非工作代碼到此答案中的工作代碼的最簡單更改。最終的URL可以是簡單的https://www.google.com/accounts/OAuthGetAccessToken

最終印刷的內容吐出oauth_tokenoauth_token_secret。這些參數用於隨後的API調用,例如在Google文檔中獲取文檔列表。

這裏的示例代碼來做到這一點:

import httplib2, os, sys, tempfile, urllib, urlparse 
import oauth2 as oauth 

######## OAUTH: GET REQUEST TOKEN ############# 
consumer = oauth.Consumer('anonymous', 'anonymous') 
creds = {'oauth_token_secret': 'INSERT_SECRET_FROM_ABOVE', 'oauth_token': 'INSERT_TOKEN_FROM_ABOVE'} 
client = oauth.Client(consumer) 
client.token = oauth.Token(creds['oauth_token'], creds['oauth_token_secret']) 
url = 'https://docs.google.com/feeds/default/private/full?v=3' 
resp, content = client.request(url, 'GET') 
if resp['status'] == '200': 
    print 'list status OK' 
    fh = open('/tmp/list.xml', 'w') 
    fh.write(content) 
    fh.close() 
else: 
    print 'list status: %s' % resp['status'] 
    print content 
    sys.exit(1)