我想使用 OpenID 将登录到在 Google App Engine 上运行的 python 应用程序限制为特定 Google Apps 域的成员。
根据线程How limit Google Federated Login to specific Apps domain? 这可以通过简单地替换普通的 google openid autentication url 来完成
和
然而,在 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 编码,或者按照建议只对问号进行编码。不幸的是,这并没有改变任何东西。重定向网址如浏览器地址栏中所示或写入日志: