Manuellement la connexion d'un utilisateur sans mot de passe
J'espère que vous pourrez m'aider à trouver la meilleure façon de mettre en œuvre un manuel (côté serveur initié) de connexion sans en utilisant le mot de passe. Laissez-moi vous expliquer le flux de travail:
- Utilisateur s'enregistre
- Merci! Un e-mail avec un lien d'activation vous a été envoyé blablabla
- (Compte existe mais n'est pas marqué activé)
- Utilisateur ouvre l'email, clique sur le lien
- (Le compte est activé)
- Merci! Vous pouvez maintenant utiliser le site
Ce que je suis en train de faire est de connecter l'utilisateur après qu'il ait cliqué sur le lien, donc il peut commencer à utiliser le site immédiatement.
Je ne peut pas utiliser son mot de passe car il est crypté dans la base de données, est la seule option de l'écriture d'un backend d'authentification personnalisé?
- Veuillez consulter le Thread ci-dessous: stackoverflow.com/questions/6560182/...
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'un mot de passe pour ouvrir une session d'un utilisateur. Le
auth.login
function prend juste unUser
objet, qui vous sont sans doute déjà en train de partir de la base de données lorsque vous activez le compte. De sorte que vous pouvez passer ce droit àlogin
.Bien sûr, vous aurez besoin d'être très attention qu'il n'y a aucune façon l'utilisateur peut usurper un lien à un déjà permis, qui aurait alors automatiquement une session en tant qu'utilisateur.
... etc.
Édité:
Hmm, n'est pas d'avis que l'obligation d'utiliser des
authenticate
en raison de la surcharge de propriété, il ajoute. En regardant le code, tout ce qu'il fait est unbackend
attribut équivalent pour le chemin d'accès du module d'authentification de serveur. Vous pouvez donc le faux - avant la connexion de l'appel ci-dessus, faites ceci:backend
paramètre est en fait dans la liste desAUTHENTICATION_BACKENDS
pour que cela fonctionne.Daniel réponse est très bonne.
Une autre façon de le faire est de créer un HashModelBackend suivant la Coutume d'Autorisation de backends https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#writing-an-authentication-backend comme ceci:
Et installez-le dans vos paramètres:
Ensuite votre point de vue serait quelque chose comme ceci:
De Django 1.10, le processus a été simplifié.
Dans toutes les versions de Django, pour qu'un utilisateur soit connecté, ils doivent être authentifié par un de votre application backends (contrôlé par le
AUTHENTICATION_BACKENDS
réglage).Tout simplement si vous voulez forcer une connexion, vous pouvez simplement prétendent que l'utilisateur a été authentifié par le premier backend à partir de cette liste:
login(request, user, backend=settings.AUTHENTICATION_BACKENDS[0])
Réponse à dan's réponse.
Une manière d'écrire votre backend:
Réponse est basée sur django.contrib.auth.backends.ModelBackend code source. C'est la réalité pour django 1.9
Et je préfère placer des backend en dessous de django reinhardt par défaut:
parce que l'activation du compte est moins possible que la connexion elle-même. Selon https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#specifying-authentication-backends:
Être prudent
ce code permettra d'authentifier vos utilisateurs même avec les mots de passe incorrects.
Vous pouvez utiliser
ska
paquet, qui a sans mot de passe de connexion à Django mis en œuvre.ska
fonctionne avec des jetons d'authentification et de sa sécurité est basée sur SHARED_KEY qui devrait être le même pour toutes les parties (les serveurs) impliqués.Sur le côté client (partie qui demande un mot de passe de moins en moins de connexion), vous générez une URL et de le signer, à l'aide de
ska
. Exemple:Par défaut de la durée de vie du jeton est de 600 secondes. Vous pouvez personnaliser que par la preuve d'un
lifetime
argument.Sur le côté serveur (site sur lequel les utilisateurs' log in), ayant à l'esprit que vous avez installé
ska
correctement, l'utilisateurest connecté lors d'une visite à l'URL si elles existaient (nom d'utilisateur match), ou non - créé. Il y a 3 rappels que vous pouvez personnaliser à votre projet Django paramètres.
USER_GET_CALLBACK
(string): Déclenché lorsque l'utilisateur a été correctement extraites de la base de données (utilisateur existant).USER_CREATE_CALLBACK
(string): Congédié après que l'utilisateur a été créé (l'utilisateur n'existait pas).USER_INFO_CALLBACK
(string): Au moment de l'authentification réussie.Voir la documentation (http://pythonhosted.org/ska/) pour plus d'.