So implementieren Sie einen Einladungsfluss mit django allauth für die Anmeldung / Anmeldung?

8

Hintergrund

Ich erstelle eine App, mit der Nutzer andere Personen zur Zusammenarbeit an verschiedenen Ressourcen einladen können. Die eingeladenen Personen könnten bereits Nutzer der App sein oder komplett neu sein. Da ich Allauth für meine Anmeldung / Anmeldung verwende, kann ein Eingeladener über die Standard-Anmeldeformulare oder über eines von drei sozialen Accounts (fb, twitter, google) auf eine Einladung antworten.

Aufgrund dieser Anforderungen funktioniert die Unterklasse DefaultAccountAdapter und das Überschreiben der Methode is_open_for_signup nicht, da dies nicht Teil des Anmeldeflusses ist, wenn ein vorhandener Benutzer eine Einladung akzeptiert.


Fluss

  • Der Benutzer sendet ein Einladungsformular unter Angabe der E-Mail-Adresse des Empfängers
  • Einladungs-E-Mail wird gesendet und enthält einen Link zum Einladungsformular
  • Nutzer klickt auf den Link zum Akzeptanzformular - möglicherweise haben sie bereits einen eigenen Nutzeraccount für die App
  • Da der Einladungslink für Einladungen den eindeutigen Schlüssel für diese Einladung enthält, fügt die Ansicht den 'Einladungsschlüssel' zur Sitzung hinzu
  • Der Eingeladene erhält die Option, sich bei einem vorhandenen Benutzerkonto anzumelden oder sich anzumelden, um die Einladung zu akzeptieren
  • Sobald der Eingeladene die Anmeldung / Anmeldung abgeschlossen hat, wird das Signal 'user_signed_up' oder 'user_signed_in' empfangen und die Sitzung wird auf einen 'invite_key' überprüft, um zu bestätigen, dass der neue Benutzer gerade eine Einladung angenommen hat
  • Die Einladung wird mithilfe des Schlüssels abgerufen und die Einladung wird für den neuen Nutzer
  • verarbeitet


Logik

Das URL-Muster für die Akzeptanzansicht

%Vor%

Dies sind die Basisklassen für meine Ansicht

Ссылка

und dies ist die Ansichtslogik für die Einladungsansicht

%Vor%


Probleme

Dies funktioniert alles, solange der Eingeladene den Link anklickt und den Einladungsprozess abschließt.

Aber ...

Wenn sie zu irgendeinem Zeitpunkt während dieses Prozesses (explizit oder aufgrund eines Fehlers) abbrechen, ist der 'invite_key' immer noch in der Sitzung vorhanden und wird daher verarbeitet, wenn die nächste Person (entweder sie oder jemand anders) sich anmeldet oder anmeldet .


Frage

Was ist der beste Weg, um mit diesem Problem umzugehen? Gibt es einen anderen Punkt, an dem der 'invite_key' zur Sitzung hinzugefügt werden kann, der garantiert, dass der Benutzer die Einladung bereits angenommen hat?

Bei der Standardanmeldung / -anmeldung könnte dies in einer überschriebenen Forms-Valid-Methode liegen, da wir wissen, dass der Benutzer einen dieser Prozesse abgeschlossen hat. Aber ich habe keine Idee, wo / wie man den "invite_key" hinzufügt, wenn sie Social Signup / Sigin verwenden?


- AKTUALISIEREN -

Mögliche Lösung # 1

Durch die soziale Anmeldung scheint der beste Ort, um den Einladungsschlüssel der Sitzung hinzuzufügen - um sicherzustellen, dass der Benutzer gerade eine Einladung über die soziale Anmeldung akzeptiert - durch Hinzufügen eines Empfängers zum Signal "pre_social_login" angezeigt zu werden. Das Problem, das ich habe, ist, wie man sicherstellt, dass der Schlüssel tatsächlich tatsächlich an dem Punkt verfügbar ist, an dem das Signal ausgelöst wird, damit es der Sitzung hinzugefügt werden kann?

Eine fehlgeschlagene Lösung bestand darin, einfach auf den HTTP_REFERER in der Empfängerfunktion zuzugreifen, der die Einladungs-URL enthalten kann. Der Schlüssel könnte daraus entfernt werden und dann zu der Sitzung hinzugefügt werden. Dies scheitert jedoch, wenn der Nutzer neu in der App ist oder derzeit nicht in seinem sozialen Konto angemeldet ist, da er zuerst auf die Anmeldeseite eines sozialen Accounts umgeleitet wird (auf der Domain des sozialen Accounts), dann bei der Rückrufumleitung und dem Signal wird gefeuert, der Wert für HTTP_REFERER existiert nicht mehr.

Ich kann keinen guten Weg finden, den Wert des Einladungsschlüssels in der Signalempfängerfunktion zugänglich zu machen, ohne dass das gleiche ursprüngliche Problem auftritt.

    
james 04.06.2014, 09:59
quelle

2 Antworten

2

Ich habe mir eine Lösung ausgedacht, aber ich bin nicht 100% glücklich damit, dass die Methode state_from_request class auf allauth.socialaccount.models.SocialLogin mit affen gepatcht wird.

Die Gründe dafür sind

  • Es ist ein einzelner gemeinsamer Logikpunkt, den alle Provider aufrufen, wenn sie ihren sozialen Authentifizierungsvorgang einleiten

  • Die Eigenschaft 'state' von SocialLogin wird bereits während des Prozesses der sozialen Anmeldung in der Sitzung gespeichert und dann während der Beendigung abgerufen und mit dem Signal 'pre_social_login'

  • übergeben

Dies ist die ursprüngliche Methode, die bestimmte Werte aus der Anfrage abruft, die dann in der Sitzung zur späteren Verwendung durch allauth gespeichert werden, sobald der Prozess abgeschlossen ist

%Vor%

Dies ist der Patch

%Vor%

Ich habe die Methode "overriden% get " aus der Ansicht entfernt und stattdessen die Methode " forms_valid " überschrieben, um den Einladungsschlüssel zur Sitzung hinzuzufügen, da zu diesem Zeitpunkt während der Standardanmeldung / Anmeldung bekannt ist, dass die Einladung akzeptiert wurde

%Vor%

Und das sind die Signalempfängerfunktionen

%Vor%     
james 10.06.2014, 14:32
quelle
0

In der Zwischenzeit hat jemand einfach ein Python-Paket (django-einladungen) gebaut, das das wirklich gut und ohne Affe-Patchen macht.

Schau es dir auf Github an: gib hier eine Beschreibung ein

    
Tommaso Barbugli 15.07.2015 18:00
quelle

Tags und Links