0

我想使用 OpenID 将登录到在 Google App Engine 上运行的 python 应用程序限制为特定 Google Apps 域的成员。

根据线程How limit Google Federated Login to specific Apps domain? 这可以通过简单地替换普通的 google openid autentication url 来完成

https://www.google.com/accounts/o8/id

https://google.com/accounts/o8/site-xrds?hd=example.com

然而,在 GAE for Python 中使用 users.create_login_url() 似乎不起作用。它会引发 500 服务器错误,该错误未显示在 google 应用程序引擎日志中(日志仅显示重定向和来自 logging.debug 的“OpenID”)。

有人对如何解决这个问题有任何建议吗?

应用程序.yaml

application: example
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /_ah/login_required
  script: main.app

- url: .*
  script: main.app
  login: required

主要.py:

import webapp2, logging
from google.appengine.api import users

# Any google account, works like a charm
#federated_identity='https://www.google.com/accounts/o8/id'

# only accounts under spefific domain, does not work
federated_identity='https://google.com/accounts/o8/site-xrds?hd=example.com'

dest_url = 'http://example.appspot.com/'

class Main(webapp2.RequestHandler):
    def get(self):
        logging.debug('Main')
        user = users.get_current_user()
        if user:
            self.response.out.write('Hello %s<p>[<a href="%s">log out</a>]' %  (user.email(),
                    users.create_logout_url(self.request.uri)))
        else:
            self.response.out.write('Not logged in')

class OpenID(webapp2.RequestHandler):
    def get(self):
        logging.debug('OpenID')
        login_url = users.create_login_url(dest_url=dest_url,
            federated_identity=federated_identity)
        self.redirect(login_url)

app = webapp2.WSGIApplication([
    ('/_ah/login_required', OpenID),
    ('/', Main)
], debug=True)

更新
Sebastian 建议解决方案可能是对联合身份进行 url 编码。我尝试对整个 url 进行 url 编码,或者按照建议只对问号进行编码。不幸的是,这并没有改变任何东西。重定向网址如浏览器地址栏中所示或写入日志:

没有 url 编码:
http://example.appspot.com/_ah/login_redir?claimid=https://google.com/accounts/o8/site-xrds?hd=example.com&continue=http://example.appspot。 com/

使用 url 编码:
http://example.appspot.com/_ah/login_redir?claimid=https%3A%2F%2Fgoogle.com%2Faccounts%2Fo8%2Fsite-xrds%3Fhd%3Dexample.com&continue=http://example。 apppot.com/

4

1 回答 1

0

我认为(我自己还没有测试过)这个问题是因为 federated_identity 没有编码。尝试用 替换问号%3F。还要确保网址

https://google.com/accounts/o8/site-xrds?hd=example.com

作品。

我做的测试是去url

http://testsk2012.appspot.com/_ah/login_redir?claimid=https://www.google.com/accounts/o8/site-xrds%3Fhd=somesite.com&continue=http://testsk2012.appspot.com/

它成功了。

于 2013-02-01T00:34:19.273 回答