以下代码演示了我遇到的问题,它可以在Github上找到。当我删除登录的安全路径时,代码可以工作,但是当我保护页面时它不会。或者,如果我使主页安全:始终/可选。除非您将 main.py 中的 http 方案从 https 更改为 http,否则此代码将无法在您的开发服务器上运行。
为什么此代码不适用于通过 https 的登录?
应用程序.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
主文件
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)
登录.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))
管理员.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))
主页.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>
登录.html
<html>
<body>
<ul>
<li>
<a href="{{login_url}}">Login</a>
</li>
</ul>
</body>
</html>
管理员.html
<html>
<body>
<p>Your logged in as: {{user}}</p>
</body>
</html>
正如您所看到的一个非常简单的示例,用户单击登录链接,转到他们使用 Google 身份验证登录的登录页面,然后重定向回不安全的主页。当用户返回主页时,预期的行为是“谁登录”返回 admin/user/anonymous 但我得到的只是匿名的,未添加注销 url 或管理员用户的管理 url。如果我使登录正常http,那么如果我有一个安全路由说/admin,该请求会收到401错误。
此代码仅在我将所有内容设置为 HTTPS 时才有效。我知道其他人正在使用安全登录页面,并且仍然能够访问不安全页面上的用户信息。我相信这与 cookie 的设置方式有关,但我对自己做错了什么感到茫然。