App Engine So pflegen Sie die Anmeldung sowohl auf http als auch auf https mit dem Benutzerdienst

Der folgende Code demonstriert das Problem, das ich habe und das auf verfügbar istGithub. Wenn ich die sichere Route für die Anmeldung entferne, funktioniert der Code, aber wenn ich die Seite sichere, funktioniert er nicht. Oder wenn ich die Homepage sicher mache: immer / optional. Dieser Code funktioniert auf Ihrem Entwickler-Server nur, wenn Sie das http-Schema in main.py von https in http ändern.

Warum funktioniert dieser Code nicht mit Anmeldungen über 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>

Wie Sie an einem sehr einfachen Beispiel sehen können, klickt der Benutzer auf den Anmeldelink, wechselt zur Anmeldeseite, auf der er sich mit Google Authentication anmeldet, und wird zur ungesicherten Startseite zurückgeleitet. Wenn der Benutzer zur Startseite zurückkehrt, wird erwartet, dass "Wer angemeldet ist" entweder admin / user / anonym zurückgibt, aber alles, was ich erhalte, ist anonym, die Abmelde-URL wird nicht hinzugefügt oder die Administrator-URL für einen Administrator. Wenn ich die Anmeldung zu einem normalen http mache, wird, wenn ich eine sichere Route habe, um zu sagen, dass / admin diese Anforderung einen 401-Fehler empfängt.

Dieser Code funktioniert nur, wenn ich alles HTTPS mache. Ich weiß, dass andere Benutzer sichere Anmeldeseiten verwenden und trotzdem auf die Benutzerinformationen auf nicht sicheren Seiten zugreifen können. Ich glaube, das hat damit zu tun, wie der Cookie gesetzt wird, aber ich weiß nicht, was ich falsch mache.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage