【问题标题】:App Engine remote_api with OpenID带有 OpenID 的 App Engine remote_api
【发布时间】:2010-06-05 16:57:00
【问题描述】:

我最近尝试将我的应用引擎应用切换为使用 openID,但我在使用 remote_api 进行身份验证时遇到了问题。 remote_api 的旧身份验证机制似乎不起作用(这是有道理的) - 我得到一个 'urllib2.HTTPError: HTTP Error 302: Found',我认为这是 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也会遇到类似的问题。干杯,

科林

【问题讨论】:

    标签: google-app-engine openid


    【解决方案1】:

    这很有趣。

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

    虽然Nick's blog entry 提供了丰富的信息,但我找不到很多关于新 OpenID 支持的文档。

    这是我写的测试应用程序,看看事情是如何工作的:

    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 帐户和联合登录之间切换我的身份验证模式,我注意到了一些事情:

    • 带有 OpenID 的 is_current_user_admin() 可以正确识别管理员用户
    • 混合模式不起作用。将身份验证设置为 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 错误
    • 通过应用的 Web 界面以管理员身份登录
    • 在您的浏览器 cookie 中,找到 myapp.appspot.com 的 ACSID cookie
    • 查找并编辑您的本地 ~/.appcfg_cookies 文件
    • 用浏览器中的 ACSID cookie 替换 myapp.appspot.com 的 ACSID cookie

    下次您尝试使用 remote_api 时,它应该可以在不提示输入凭据的情况下工作。但是,每次 cookie 过期时,您都必须重复最后 4 个步骤。您可以在管理控制台中将过期时间从 1 天增加到 2 周,以尽量减少烦恼。玩得开心!

    【讨论】:

    • 有一个 hacky 解决方案 - 我很快就会写博客。不过,我还没有把它放在一起。 ://
    • 真棒答案 - 干杯德鲁。完美运行 :) 对于其他人,您需要根据 netscape cookie 格式构建您的 cookie。每个 cookie 有一行文本 - 一系列由制表符分隔的标记。以下对我有用 '.appspot.com FALSE / FALSE ' - 这里的第 3.5 节 - cookiecentral.com/faq 给出了一个例子。注意我没有把前导“。”并且与示例相比具有 FALSE 而不是 TRUE。此外,实际的 ACSID cookie 字符串要长得多。再次感谢。
    • 不错的答案。如果您没有像我一样使用 OpenId 功能,您也可以切换回 Google 帐户。 :)
    【解决方案2】:

    这绝对是一个问题...通过在http://code.google.com/p/googleappengine/issues/detail?id=3258 上注明您有兴趣让 Google 解决此问题,并随时在此处添加您的任何解决方法。

    在相关的说明中,我们也认识到文档有些稀疏,因此我正在撰写一篇文章,希望能填补其中的一些漏洞...敬请关注http://code.google.com/appengine/articles

    【讨论】:

      【解决方案3】:

      这里是a workaround you can use,直到找到更永久的解决方案。

      【讨论】:

      • @Nick 这似乎是特定于 python 的。有一个永久的解决方案,Java 有没有一个?
      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多