4 Stimmen

Google App Engine : SimpleAuth : Url-Umleitung im laufenden Betrieb

Ich verwende SimpleAuth von Alex (https://github.com/crhym3/simpleauth) in meiner GAE-Anwendung. Ich habe eine Jquery Powered Login-Box in meinem Basis-Template, was bedeutet, dass Benutzer von jeder URL innerhalb der Anwendung anmelden können. Ich möchte, dass die Benutzer zurück auf die Seite umgeleitet werden, von der aus sie sich anmelden wollten. Gibt es eine Möglichkeit, wie wir dies mit Oauth2 erreichen können, oder können wir nur Benutzer zurück zu einer bestimmten URL umleiten?

5voto

alex Punkte 2450

Wenn Sie SimpleAuth verwenden, nehme ich an, Sie sind wahrscheinlich mit webapp2, so @jmort253 Beispiele sind nicht genau, wie ich es tun würde (z.B. webapp2 hat eingebaute Sitzungen, also warum noch eine andere Bibliothek für Sitzungen Handhabung verwenden).

Obwohl, konzeptionell ist es richtig: was Sie brauchen, ist die ursprüngliche URL irgendwo in einer Sitzung zu speichern, bevor Sie den Authentifizierungsprozess starten. Dann verwenden Sie diese gespeicherte URL für eine endgültige Umleitung nach erfolgreicher Authentifizierung.

Ausgehend vom Code der Beispielanwendung von SimpleAuth müssen Sie im Wesentlichen die letzte Zeile von _on_signin() um die Benutzer zu der ursprünglichen URL umzuleiten, von der sie gekommen sind (anstelle von '/profile').

Um die ursprüngliche URL der Anfrage zu speichern, können Sie einen einfachen Wrapper verwenden, z. B.

def simpleauth_login_required(handler_method):
    """A decorator to require that a user be logged in to access a handler.

    To use it, decorate your get() method like this:

        @simpleauth_login_required
        def get(self):
            user = self.current_user
            self.response.out.write('Hello, ' + user.name())
    """
    def check_login(self, *args, **kwargs):
        if self.request.method != 'GET':
            self.abort(400, detail='The login_required decorator '
                'can only be used for GET requests.')

        if self.logged_in:
            handler_method(self, *args, **kwargs)
        else:
            self.session['original_url'] = self.request.url
            self.redirect('/my-login-page-where-users-can-choose-auth-method')

    return check_login

Zurück zu dieser _on_signin()-Umleitungszeile, statt self.redirect('/profile') würden Sie so etwas tun:

target = self.session['original_url']
self.redirect(target)

Ein paar Anmerkungen:

  • Das obige Beispiel geht davon aus, dass Sie eine logged_in Methode, die anzeigt, ob die aktuelle Anfrage von einem bereits authentifizierten Benutzer gestellt wird oder nicht;
  • Sie werden wahrscheinlich die "original_url" aus der Sitzung löschen wollen (wenn sie sich erfolgreich authentifiziert haben)

Die Credits für das obige Beispiel gehen an webapp2_extras.appengine.users Modul .

1voto

jmort253 Punkte 33083

Wenn Ihr Benutzer versucht, sich anzumelden, fordert Ihre Anwendung zunächst ein Zugriffstoken an und erstellt dann die Google OAuth2 URL. Ihre Anwendung leitet den Nutzer zu google.com weiter, wo sich der Nutzer anmelden muss. Diese Anmelde-URL enthält das Zugriffstoken aus der Anfrage Ihres Servers an Google. Es ist aus Sicherheitsgründen an diese Weiterleitungs-URL gebunden.

Diese Umleitungs-URL soll den Anmeldevorgang abschließen, indem sie einen erfolgreichen Anmeldevorgang an Ihre Anwendung zurückgibt, so dass Sie die Anmeldung des Benutzers, die Registrierung des Benutzers oder andere Aufgaben, die Ihre Anwendung ausführen muss, abschließen können.

Danach liegt der Ball bei Ihnen, und Sie können Ihre App so programmieren, dass sie tut, was Sie wollen. Mit anderen Worten: Google kümmert sich nur darum, dass die Anfrage an Ihren sicheren Endpunkt weitergeleitet wird. Sobald das erledigt ist, kümmert sich Google nicht mehr darum, was Sie tun; es ist Ihre App.

Um den Benutzer auf die Seite zurückzuleiten, auf der er/sie sich vor dem Einloggen befand, was eine großartige Verbesserung der Benutzerfreundlichkeit darstellt, müssen Sie Folgendes tun:

Schritte zur Umleitung des Benutzers:

1 Bevor sich der Benutzer anmeldet, speichern Sie die Seite, auf der er sich befindet, in einer Sitzung.

session = appengine_utilities.sessions.Session()
session["target_url"] = "/example_page.html"   # sets keyname to current page

2 Als Nächstes melden Sie den Benutzer wie gewohnt an.

3 Nachdem Google den Nutzer zu Ihrer Authentifizierungsumleitungs-URL umgeleitet hat, rufen Sie die Ziel-URL aus der Sitzung ab:

target_url = session['target_url']

4 Schließlich leiten Sie den Benutzer zu dieser URL um.

Kurz gesagt, Sie können das Ziel erreichen, Ihre Nutzer zu jeder beliebigen Ziel-URL umzuleiten, solange Sie zunächst die Umleitung von Google zu einer einzigen, festgelegten Umleitungs-URL akzeptieren.

Die Sitzungsbeispiele stammen aus dem Becherglas Website. Zusätzlich, Nick Johnsons Webapps auf Appengine Teil 5 Der Blogartikel befasst sich mit Sitzungen mit Beaker.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X