我試圖在Google App Engine中爲我的學校報紙完成故事分配系統。它將跟蹤作者的截止日期,允許作者選擇故事,並對「週報」一目瞭然。我和我的合作伙伴正試圖將其與Google Apps安裝報告完全整合。哦,而且我們必須使用3腳Oauth,因爲我們沒有Google Apps Premier。Oauth + Aeoid + Python + Google App Engine + Google文檔
在那個努力中,我偶然發現了Aeoid並能夠按照說明進行聯合登錄工作。非常酷!
我遇到麻煩的地方是使用Oauth獲取用戶的Google文檔列表。我在這裏設置了一個測試頁面:mustrun.cornellsun.com/test。它給了我錯誤 - 我在這封郵件的底部複製了它們。我不知道這是否與我的消費者祕密有關(我應該使用我從谷歌市場獲得的密鑰?還是應該使用我從管理域頁面獲得的密鑰?)。現在我正在使用我從管理域頁面獲得的密鑰
此外,更復雜的是,實際的appspot域爲mustrun2sun [] .appspot [太新不能發佈多個鏈接] .com,但是我在谷歌應用程序中設置它,以便只有來自我的域的用戶才能登錄,並且還可以將應用程序部署到我的域中。 (應用程序被部署爲must[]run[].corn[]ellsun[].[]com
&一切都是指這樣,即使在管理域的事情。)
我使用GDClient 2.0類,所以我相當確信,一切都應該按計劃工作...即我沒有使用舊的服務或任何東西。我使用htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]ml
作爲我的Oauth「舞蹈」的一個模板,因爲Google示例已過時&使用舊的Google數據1.0庫 - 我想。
當我去我的測試頁面,我得到的錯誤是
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 511, in __call__
handler.get(*groups)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/main.py", line 170, in get
feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/docs/client.py", line 141, in get_doclist
auth_token=auth_token, **kwargs)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 635, in get_feed
**kwargs)
File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 308, in request
response, Unauthorized)
Unauthorized: Unauthorized - Server responded with: 401, <HTML>
<HEAD>
<TITLE>Token invalid - Invalid AuthSub token.</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Token invalid - Invalid AuthSub token.</H1>
<H2>Error 401</H2>
</BODY>
</HTML>
而且,因爲這是很難W/O任何源代碼,以下是相關代碼:
import gdata.auth
import gdata.gauth
import gdata.docs.client
import gdata.docs.data
import gdata.docs.service
import gdata.alt.appengine
from aeoid import middleware, users
class GetOauthToken(webapp.RequestHandler):
def get(self):
user_id = users.get_current_user().user_id()
saved_request_token = gdata.gauth.AeLoad("tmp_"+user_id)
gdata.gauth.AeDelete ("tmp_" + user_id)
request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
#upgrade the token
access_token = client.GetAccessToken(request_token)
#save the upgraded token
gdata.gauth.AeSave(access_token, user_id)
self.redirect('/test')
class Test(webapp.RequestHandler):
def get(self):
TOKEN = gdata.gauth.AeLoad(users.get_current_user().user_id())
if TOKEN:
client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
client.auth_token = gdata.gauth.AeLoad(users.get_current_user().user_id()) #could try to put back as TOKEN?
self.response.out.write('moo baby')
client.ssl = True
feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
self.response.out.write(feed)
self.response.out.write('moo boobob')
self.response.headers['Content-Type'] = 'text/plain'
for entry in feed.entry:
self.response.out.writeln(entry.title.text)
else:
# Get unauthorized request token
gdata.gauth.AeDelete(users.get_current_user().user_id())
client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
client.ssl = True # Force communication through HTTPS
oauth_callback_url = ('http://%s/get_oauth_token' %
self.request.host)
request_token = client.GetOAuthToken(
SETTINGS['SCOPES'], oauth_callback_url, SETTINGS['CONSUMER_KEY'],
consumer_secret=SETTINGS['CONSUMER_SECRET'])
gdata.gauth.AeSave(request_token, "tmp_"+users.get_current_user().user_id())
# Authorize request token
domain = None#'cornellsun.com'
self.redirect(str(request_token.generate_authorization_url(google_apps_domain=domain)))
我一直在網上尋找答案&我一直未能找到一個。
Aeoid(或其他OpenID的LIB)可能需要採取的OAuth + OpenID的組合。 – iamgopal 2010-07-21 09:03:18
@iamgopal - 你看過我的回答嗎? – sje397 2010-07-21 17:11:39