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
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.
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'
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
Und das sind die Signalempfängerfunktionen
%Vor%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
Tags und Links python django django-allauth