Manuelle Protokollierung in einem Benutzer ohne Passwort
-
03-10-2019 - |
Frage
Ich hoffe, dass Sie mir helfen können, den besten Weg Figur ein Handbuch (serverseitige initiiert) login ohne mit dem Passwort zu implementieren. Lassen Sie mich den Workflow erklären:
- Benutzerregister
- Danke! Eine E-Mail mit einem Aktivierungslink gesendet blablabla worden
- (Account existiert nun aber markiert ist nicht aktiviert)
- Benutzer öffnet E-Mail, Klicks verknüpfen
- (Account aktiviert ist)
- Danke! Sie können nun die Website verwenden
Was ich versuche in der Benutzer-Log zu tun, nachdem er den E-Mail-Link geklickt hat, damit er die Website sofort nutzen kann.
Ich kann nicht sein Passwort verwenden, da es in der DB verschlüsselt ist, ist die einzige Möglichkeit, einen benutzerdefinierten Authentifizierungs-Backend zu schreiben?
Lösung
Andere Tipps
Daniels Antwort ist sehr gut.
Eine andere Möglichkeit, es zu tun ist, eine HashModelBackend im Anschluss an die benutzerdefinierte Autorisierung Backends erstellen https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#writing-an-authentication-backend wie folgt aus:
class HashModelBackend(object):
def authenticate(self, hash=None):
user = get_user_from_hash(hash)
return user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
Und dann installieren Sie diese in Ihren Einstellungen:
AUTHENTICATION_BACKENDS = (
'myproject.backends.HashModelBackend',
'django.contrib.auth.backends.ModelBackend',
)
Dann ist Ihre Ansicht so etwas wie dieses wäre:
def activate_account(request, hash):
user = authenticate(hash=hash)
if user:
# check if user is_active, and any other checks
login(request, user)
else:
return user_not_found_bad_hash_message
Ab Django 1.10 ist der Prozess vereinfacht.
In allen Versionen von Django, um für einen Benutzer angemeldet sein, müssen sie von einem App-Backends (gesteuert durch die AUTHENTICATION_BACKENDS
Einstellung) authentifiziert.
Wenn Sie einfach nur ein Login erzwingen wollen, können Sie einfach behauptet, dass der Benutzer durch das erste Back-End aus dieser Liste authentifiziert wurde:
from django.conf import settings
from django.contrib.auth import login
# Django 1.10+
login(request, user, backend=settings.AUTHENTICATION_BACKENDS[0])
# Django <1.10 - fake the authenticate() call
user.backend = settings.AUTHENTICATION_BACKENDS[0]
login(request, user)
Antwort auf dan 's Antwort.
Ein Weg, um Ihre Backend zu schreiben:
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
class HashModelBackend(ModelBackend):
def authenticate(self, username=None, **kwargs):
UserModel = get_user_model()
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel._default_manager.get_by_natural_key(username)
return user
except UserModel.DoesNotExist:
return None
Antwort basiert auf django.contrib.auth.backends.ModelBackend Quellcode. Es ist tatsächlich für django 1.9
Und ich würde lieber Ort individuelle Backend unter Djangos Standard:
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'yours.HashModelBackend',
]
, weil die Kontoaktivierung ist weniger möglich als sich anmelden. Nach https://docs.djangoproject.com/ de / 1.9 / Themen / auth / Customizing / # Angabe-Authentisierungs-Backends :
Die Reihenfolge der AUTHENTICATION_BACKENDS Angelegenheiten, so dass, wenn der gleiche Benutzername und das Passwort gültig ist in mehreren Backends, wird Django bei der ersten positiven Match Verarbeitung stoppen.
Seien Sie vorsichtig, Dieser Code wird Ihre Benutzer sogar mit falschen Passwörtern authentifizieren.
Sie können ska
Paket verwenden, die umgesetzt Passwort anmelden zu Django hat. ska
arbeitet mit Authentifizierungs-Token und seine Sicherheit beruht auf Shared_Key, die für alle Beteiligten (Server) beteiligt gleich sein sollte.
Auf Client-Seite (Partei, dass Anfragen ein Passwort anmelden), können Sie eine URL generieren und zu unterschreiben, ska
verwenden. Beispiel:
from ska import sign_url
from ska.contrib.django.ska.settings import SECRET_KEY
server_ska_login_url = 'https://server-url.com/ska/login/'
signed_url = sign_url(
auth_user='test_ska_user_0',
secret_key=SECRET_KEY,
url=server_ska_login_url
extra={
'email': 'john.doe@mail.example.com',
'first_name': 'John',
'last_name': 'Doe',
}
)
Standard Lebensdauer des Tokens ist 600 Sekunden. Sie können die anpassen, indem ein lifetime
Argument beweisen.
Auf der Serverseite (Seite, auf welche der Benutzer Login), im Auge haben, dass Sie ska
richtig installiert haben, kann der Benutzer
wird protokolliert, in der URL auf den Besuch, wenn sie (Benutzername Spiel) existiert, oder auf andere Weise - erstellt. Es gibt 3 Rückrufe, dass Sie in Ihrem Projekt der Django-Einstellungen anpassen können.
-
USER_GET_CALLBACK
(string):. Fired, wenn der Benutzer aus der Datenbank erfolgreich geholt wurde (bestehende Benutzer) -
USER_CREATE_CALLBACK
(string):. Fired direkt nach dem Benutzer erstellt wurde (vom Benutzer nicht existieren) -
USER_INFO_CALLBACK
(string):. Fired bei erfolgreicher Authentifizierung
Sehen Sie die Dokumentation ( http://pythonhosted.org/ska/ ) für mehr.