以下代碼演示了我擁有的問題,它在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的設置有關,但是我在做錯的時候感到不知所措。
你是什麼意思的「不工作」?換句話說,實際行爲與你的預期有什麼不同? – allyourcode