2011-05-01 72 views
7

我正在使用反向代理在自定义域上启用ssl。该代理在公共页面上正常工作,但是当用户尝试访问login_required目录时,登录网址会在登录后将它们转移到我的appspot域中。Google App Engine:反向代理+ OpenID,用户在登录后被重定向到appspot域名

有没有办法让用户保留在自定义域中?

这里是我的登陆处理程序:

class OpenIDLoginHandler(webapp.RequestHandler): 
    def get(self): 
     domain = self.request.get('domain') 
     continue_url = self.request.GET.get('continue') 

     if not continue_url: 
      continue_url = 'https://my_domain/login_required_directory/'  

     if domain: 
      self.redirect(users.create_login_url(dest_url=continue_url, 
       _auth_domain=None,federated_identity=domain)) 
     else:    
      login_url = users.create_login_url(dest_url=continue_url, 
       federated_identity='https://www.google.com/accounts/o8/id')   
      self.redirect(login_url) 

application = webapp.WSGIApplication(
        [          
         ('/_ah/login_required', OpenIDLoginHandler)], 
        debug=True)  

def main(): 
    run_wsgi_app(application) 

if __name__ == "__main__": 
    main() 

我试图覆盖在users.create_login_url呼叫的目的地网址 - 函数仍返回与Appspot上域为“继续”参数LOGIN_URL,像这样的:

“的https:// appspot_domain/_ah/login_redir ClaimID的= HTTPS://www.google.com/accounts/o8/id &继续= https://开头appspot_domain”

我试图简单地重写返回的login_url和re将“continue”参数放置在我的自定义域中,但这会导致404错误。

有什么想法?

提前致谢!

+2

您可以将继续URL设置为appspot域上的页面,该页面发出最终重定向回代理域。不过,您可能会遇到Cookie问题。您的身份验证Cookie始终会在appspot.com上设置;客户端不会将cookie传递回您的代理域。 – 2011-05-01 00:56:36

+0

@Drew,很遗憾,您对auth cookie是正确的。在使用代理域时,用户会话无法识别,因此恐怕登录后的重定向会导致无限重定向循环。似乎我可以通过直接从代理服务器处理登录重定向来解决此问题,但是我找不到有关'/ _ah/login_redir'的任何文档,这些文档可以帮助我复制或完全理解其功能。 – 2011-05-02 18:12:50

回答

1

我不确定这是否适合您,但下一个版本的应用引擎声称支持自定义域名(http://code.google.com/appengine/business/)上的ssl。如果您的应用程序暂时不能投入使用,那么等待他们正式添加支持后可能会更容易。他们似乎在约3个月的发布周期(http://code.google.com/appengine/docs/revision_history.html)

+1

这是我的首选选项,我耐心等待发布。毕竟,谁想要处理管理反向代理的额外复杂性,更不用说另一个潜在的失败点了? – 2011-06-17 15:23:17

0

您可以在app.yaml中自行处理,并使用通配符处理程序重定向所有请求ssl。如果你不想这样处理所有的请求,你可以使用正则表达式来限制通配符。

的app.yaml:

application: yourthing 
version: 1 
runtime: python 
api_version: 1 

handlers: 

- url: .* 
    script: redirect_to_ssl.py 

这也清理可能从谁键入URL,用户进来任何非HTTPS请求。