Python 应用程序引擎如何使用用户服务在http和https上维护登录

Python 应用程序引擎如何使用用户服务在http和https上维护登录,python,google-app-engine,Python,Google App Engine,下面的代码演示了我遇到的问题,它在上可用。当我删除登录的安全路由时,代码会工作,但当我保护页面时,代码不会工作。或者如果我使主页安全:始终/可选。除非将main.py中的http方案从https更改为http,否则此代码无法在您的开发服务器上运行 为什么此代码不适用于通过https进行登录 app.yaml application: testapp version: 1 runtime: python27 api_version: 1 threadsafe: yes libraries: -

下面的代码演示了我遇到的问题,它在上可用。当我删除登录的安全路由时,代码会工作,但当我保护页面时,代码不会工作。或者如果我使主页安全:始终/可选。除非将main.py中的http方案从https更改为http,否则此代码无法在您的开发服务器上运行

为什么此代码不适用于通过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))
管理员

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>

谁已登录:{{loggedin}

  • {%ifequal loggedin“匿名”%} {%else%} {%endifequal%}
  • {%ifequal loggedin“Admin”%%
  • {%endifequal%}
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>

您的登录名为:{{user}

正如您可以看到的一个非常简单的示例,用户单击登录链接,进入登录页面,使用Google身份验证登录,并重定向回不安全的主页。当用户返回主页时,预期的行为是“谁登录”返回admin/user/anonymous,但我得到的是匿名的,没有添加注销url或管理员用户的管理员url。如果我使用正常的http登录,那么如果我有一个安全的路由,比如说/admin,那么请求会收到一个401错误


此代码仅在我将所有内容设置为HTTPS时有效。我知道其他人正在使用安全登录页面,并且仍然能够访问不安全页面上的用户信息。我相信这与cookie的设置方式有关,但我不知道我做错了什么。

您是否与FireCookie(或类似产品)核对过cookie的详细信息?路径、域等等? 您是否使用不同的域名进行安全保护?比如https的secure.app.com和http的www.app.com


我从来没有在GAE上尝试过https,我只是想知道,如果我说的是明显的东西,我会很抱歉地帮助你。

你有没有向FireCookie(或类似网站)查询过cookie的详细信息?路径、域等等? 您是否使用不同的域名进行安全保护?比如https的secure.app.com和http的www.app.com

我从来没有在GAE上尝试过https,我只是想知道,如果我说的是明显的东西,我会很抱歉地帮助你。

你说的“不起作用”是什么意思?换句话说,实际的行为与你期望的有什么不同?你所说的“不起作用”是什么意思?换句话说,实际行为与您预期的有什么不同?