带有OpenID的App Engine remote_api

时间:2010-06-05 16:57:00

标签: google-app-engine openid

我最近尝试将我的应用引擎应用切换为使用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类似的问题。欢呼声,

科林

3 个答案:

答案 0 :(得分:9)

这很有趣。

查看remote_api,验证流程似乎是这样的:

我找不到关于新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帐户和联合登录之间翻转我的身份验证模式,我注意到了一些事情:

  • is_current_user_admin()使用OpenID
  • 正确识别管理员用户
  • 混合模式不起作用。将身份验证设置为Google帐户后,使用federated_identity调用create_login_url会引发NotAllowedError
  • 在登录过程结束时仍会生成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_stub.ConfigureRemoteDatastore时传递save_cookies = True
  • 尝试控制台身份验证并获取302错误
  • 通过应用的网络界面以管理员身份登录
  • 在浏览器Cookie中,找到myapp.appspot.com的ACSID cookie
  • 查找并编辑您的本地〜/ .appcfg_cookies文件
  • 将myapp.appspot.com的ACSID cookie替换为浏览器中的

下次尝试使用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,直到有更长久的解决方案。