我正在尝试在Google App Engine中为我的学校报纸完成一个故事分配系统。它将跟踪作家的截止日期,允许作家收集故事,并对周故事进行“一目了然”的观察。我和我的合作伙伴正试图将它与我们的报纸Google Apps安装完全整合。哦,我们必须使用3条腿的Oauth,因为我们没有Google Apps Premier。
在那次努力中,我偶然发现了Aeoid并且能够按照说明进行联合登录工作。这很酷!
我遇到麻烦的地方是使用Oauth来获取用户google文档的列表。我在这里设置了测试页面:mustrun.cornellsun.com/test。它给了我错误 - 我已将它们复制到这封邮件的底部。我不知道这是否与我的消费者秘密有关(我应该使用从谷歌市场获得的密钥?还是应该使用我从管理域页面获得的密钥?)。现在我正在使用我从管理域页面获得的密钥
同样复杂的是,实际的appspot域名是mustrun2sun [] .appspot [太新了不能发布多个链接] .com,但我在谷歌应用程序中设置它,以便只有来自我的域的用户才能登录in以及应用程序部署在我的域上。 (应用程序部署为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数据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>
此外,由于这对任何源代码都很难,下面是相关代码:
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)))
我一直在网上寻找答案&amp;我找不到一个。
答案 0 :(得分:3)
我有一个工作的python App Engine应用程序,它使用OpenID和OAuth来获取你的谷歌联系人:
http://github.com/sje397/Chess
它正在运行:
请注意,由于App Engine支持built-in OpenID,因此不再需要Aeoid。
答案 1 :(得分:1)
我刚发现浪费了几个小时,如果网址不正确,你也会得到401.
在我的例子中,我正在做
.../buzz/v1/activities/@me/@self**?&**alt=json
而不是
.../buzz/v1/activities/@me/@self**?**alt=json
答案 2 :(得分:0)
我个人没有与OAuth合作,但我注意到的一些事情可能(或可能不)帮助:
401错误可能是HTTP 401错误,这意味着该网址有效但需要进行身份验证。这显然可以通过失败的OAuth尝试来解释,但重定向未登录到其他页面的用户也很重要。
分配Feed变量时发生错误。 auth_token参数应该只是一个用户名吗?
3.你正在使用这条线。
gdata.gauth.AeLoad(users.get_current_user().user_id())
频繁。尽管它可能与您的身份验证问题无关,但您可能最好只进行一次此查询并将其存储在变量中。然后,当您再次需要它时,以这种方式访问它。它将提高您的申请速度。
我再次道歉,我没有具体的OAuth经验。我只是试图扫描并找到一些可能会让你走上正确道路的东西。