80 votes

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é) connectez-vous sans l'aide du mot de passe. Laissez-moi vous expliquer le flux de travail:

  • L'utilisateur enregistre
  • Merci!!!! Un e-mail avec un lien d'activation vous a été envoyé blablabla
  • (Compte existe mais n'est pas marqué activé)
  • L'utilisateur ouvre l'email, clique sur le lien
  • (Le compte est activé)
  • Merci!!!! Vous pouvez maintenant utiliser le site

Ce que j'essaie 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é?

104voto

Daniel Roseman Points 199743

Vous n'avez pas besoin d'un mot de passe pour ouvrir une session d'un utilisateur. L' auth.login fonction prend juste un User 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 à l' login.

Bien sûr, vous devez être très prudent 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.

from django.contrib.auth import login

def activate_account(request, hash):
    account = get_account_from_hash(hash)
    if not account.is_active:
        account.activate()
        account.save()
        user = account.user
        login(request, user)

... etc.

Modifié:

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 un backend 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:

user.backend = 'django.contrib.auth.backends.ModelBackend'

27voto

dar Points 4508

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 http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend comme ceci:

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

Et puis l'installer dans vos paramètres:

AUTHENTICATION_BACKENDS = (
    'myproject.backends.HashModelBackend',
    'django.contrib.auth.backends.ModelBackend',
)

Ensuite, votre point de vue serait quelque chose comme ceci:

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

2voto

Artur Barseghyan Points 439

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 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:

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',
    }
    )

Par défaut 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'utilisateur est 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'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X