我最近尝试将我的应用引擎应用切换为使用openID,但我遇到了使用remote_api进行身份验证的问题。 remote_api的旧身份验证机制似乎不起作用(这是有道理的) - 我得到一个'urllib2.HTTPError:HTTP错误302:找到',我假设是appengine将我重定向到openid登录页面我已经建立。
我想我错过了一些相当明显的东西。目前我的remote_api脚本中包含以下内容 -
remote_api_stub.ConfigureRemoteDatastore(app_id=app_id, path='/remote_api', auth_func=auth_func, servername=host, secure=secure)
其中auth_func是
def auth_func():
return raw_input('Username:'), getpass.getpass('Password:')
我需要提供什么来提供给remote_api?我猜也是会遇到与bulkloader类似的问题。欢呼声,
科林
答案 0 :(得分:9)
这很有趣。
查看remote_api,验证流程似乎是这样的:
auth
令牌解析出响应正文ACSID
Cookie ACSID
Cookie 我找不到关于新OpenID支持的大量文档,但Nick's blog entry提供了信息。
这是我写的测试应用程序,用于查看工作原理:
的app.yaml:
handlers:
- url: /remote_api
script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
login: admin
- url: /.*
script: test.py
test.py:
class MainPage(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
if user:
self.response.out.write("Hi, %s!<hr>admin is %s" % (user.user_id(),
users.is_current_user_admin()))
else:
self.redirect(users.create_login_url('/', None,
'https://www.google.com/accounts/o8/id'))
在Google帐户和联合登录之间翻转我的身份验证模式,我注意到了一些事情:
ACSID
Cookie,只有来自/ _ah / openid_verify而不是/ _ah / login 那么使用联合登录时remote_api会发生什么?如果我们使用默认的appengine_rpc.HttpRpcServer,它会尽职尽责地遵循顶部描述的相同Google帐户身份验证流程,只有应用程序不再认为/ _ah / login返回的ACSID
cookie有效,所以您仍然未经身份验证,您将获得302重定向到OpenID登录页面/ _ah / login_required。
我不知道这里有什么正确的解决方案。似乎它需要API更新。也许尼克或其他一些Google员工可以权衡。
目前,这是一个hacky解决方法:
下次尝试使用remote_api时,它应该可以在不提示输入凭据的情况下工作。但是,每次cookie过期时,您都必须重复最后4个步骤。您可以在管理控制台中将过期时间从1天提高到最高2周,以最大限度地减少烦恼。玩得开心!
答案 1 :(得分:3)
这绝对是一个问题...标记您有兴趣让Google通过在http://code.google.com/p/googleappengine/issues/detail?id=3258加注明星来解决此问题,并随时添加您的任何变通办法。
在相关的说明中,我们也认识到文档有点稀疏,所以我正在编写一篇文章,希望填补其中的一些漏洞...敬请关注{{3} }
答案 2 :(得分:2)
这是a workaround you can use,直到有更长久的解决方案。