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?

War es hilfreich?

Lösung

Sie brauchen kein Passwort in einen Benutzer anmelden. Die

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top