2012-06-09 31 views
2

以下代碼演示了我擁有的問題,它在Github上可用。當我刪除用於登錄的安全路由時,該代碼起作用,但是當我確保頁面不安全時。或者,如果我使主頁安全:始終/可選。除非您將main.py中的http方案從https更改爲http,否則此代碼無法在您的開發服務器上運行。App Engine Howto通過用戶服務維護http和https上的登錄

爲什麼此代碼無法通過https登錄?

的app.yaml

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

libraries: 
- name: webapp2 
    version: latest 

handlers: 
- url: /login 
    script: main.app 
    secure: always 

- url: /.* 
    script: main.app 
    secure: never 

main.py

import webapp2 
from google.appengine.ext.webapp import template 
from google.appengine.api import users 
from login import LoginHandler 
from admin import AdminHandler 

class HomeHandler(webapp2.RequestHandler): 
    def get(self): 
     user = users.get_current_user() 
     if users.is_current_user_admin(): 
      loggedin = "Admin" 
      values = {'loggedin': loggedin, 
         'logout_url': users.create_logout_url("/")} 
     elif user: 
      loggedin = "User" 
      values = {'loggedin': loggedin, 
         'logout_url': users.create_logout_url("/")} 
     else: 
      loggedin = "Anonymous" 
      values = {'loggedin': loggedin, 
         'logout_url': users.create_logout_url("/")} 
     self.response.out.write(template.render('home.html', values)) 

app = webapp2.WSGIApplication([ 
    webapp2.Route(r'/', HomeHandler), 
    webapp2.Route(r'/login', LoginHandler, schemes=['https']), 
    webapp2.Route(r'/admin', AdminHandler, schemes=['https']) 
], debug=True) 

login.py

import webapp2 
from google.appengine.ext.webapp import template 
from google.appengine.api import users 

# Login page Request Handler Class 
class LoginHandler(webapp2.RequestHandler): 
    def get(self): 
     user = users.get_current_user() 

     values = {'login_url': users.create_login_url("/")} 
     self.response.out.write(template.render('login.html', values)) 

admin.py

import webapp2 
from google.appengine.ext.webapp import template 
from google.appengine.api import users 

# Login page Request Handler Class 
class AdminHandler(webapp2.RequestHandler): 
    def get(self): 
     user = users.get_current_user() 

     values = {'user': users.nickname()} 
     self.response.out.write(template.render('admin.html', values)) 

home.html的

<html> 
<body> 
<p>Who is logged in: {{loggedin}}</p> 
<ul> 
    <li> 
    {% ifequal loggedin "Anonymous" %} 
     <a href="/login">Login</a> 
    {% else %} <!-- user is logged in --> 
     <a href="{{logout_url}}">Logout</a> 
    {% endifequal %} 
    </li> 
    {% ifequal loggedin "Admin" %} 
    <li class="right"> 
     <a href="/admin">Admin</a> 
    </li> 
    {% endifequal %} 
</ul> 
</body> 
</html> 

的login.html

<html> 
<body> 
<ul> 
    <li> 
     <a href="{{login_url}}">Login</a> 
    </li> 
</ul> 
</body> 
</html> 

admin.html

<html> 
<body> 
     <p>Your logged in as: {{user}}</p> 
</body> 
</html> 

正如你可以看到一個很簡單的例子,用戶點擊登錄鏈接,進入登錄頁面,他們通過Google身份驗證登錄並重定向到不安全的主頁。當用戶回到主頁時,預期的行爲是「誰登錄」返回admin/user /匿名,但我得到的只是匿名,不會添加註銷url或管理員用戶的管理員url。如果我使登錄正常http,然後如果我有一個安全的路線說/管理該請求收到401錯誤。

此代碼僅在使所有HTTPS成爲可用時纔有效。我知道其他人正在使用安全的登錄頁面,並仍然能夠訪問不安全頁面上的用戶信息。我相信這與Cookie的設置有關,但是我在做錯的時候感到不知所措。

+0

你是什麼意思的「不工作」?換句話說,實際行爲與你的預期有什麼不同? – allyourcode

回答

0

您是否使用FireCookie(或類似的)檢查了cookie的詳細信息?路徑,域等? 您是否使用不同的域名進行保護?像secure.app.com的https和www.app.com的http?

我從來沒有嘗試https GAE,我只是想知道如果我說明顯的東西試圖幫助很抱歉。