2011-07-02 8 views
18

Używam domyślnego systemu uwierzytelniania z django, ale dodałem bibliotekę OpenID, w której mogę uwierzytelniać użytkowników przez OpenID. Chciałbym się zalogować, ale wygląda na to, że korzystam z domyślnego systemu Django, potrzebuję hasła do uwierzytelnienia użytkownika. Czy istnieje sposób na obejście tego bez faktycznego używania hasła?uwierzytelnianie django bez hasła

chciałbym zrobić coś takiego ...

user = ... # queried the user based on the OpenID response 
user = authenticate(user) # function actually requires a username and password 
login(user) 

I prędzej zostawić wyłączyć funkcję authenticate, ale przywiązuje backend pole, które jest wymagane przez logowania.

+0

Możliwy duplikat [Ręczne logowanie użytkownika bez hasła] (http://stackoverflow.com/questions/2787650/manually-logging-in-a-user- bez-hasła). – easoncxz

Odpowiedz

2

Można to łatwo naprawić, tworząc własne authentication backend i dodając je do ustawienia AUTHENTICATION_BACKENDS.

Dostępne są już niektóre wersje OpenID, więc przy odrobinie poszukiwań można zaoszczędzić sobie trudu napisania jednego.

+0

Miałem problemy z backjanami Django, ponieważ nie były kompatybilne z unikalnym sposobem tworzenia OpenID przez Google. W każdym razie, tak jak powiedziałem, mam już backend oparty na hasłach i po prostu chcę używać OpenID w niektórych przypadkach - nie przełączam się na ścisły backend OpenID. – voodoogiant

+0

@voodoogiant: w zależności od argumentów słów kluczowych wybrany jest backend uwierzytelniania. Więc jeśli użyjesz 'openid_token' dla twojego backendu OpenID i' username' z 'hasłem' dla twojego normalnego systemu uwierzytelniania, niż oba będą działać. – Wolph

8

Jest to bit hack, ale jeśli nie chcą przepisać kilka rzeczy usunąć Uwierzytelnij

user.backend = 'django.contrib.auth.backends.ModelBackend' 
login(request, user) 

użytkownik byłby to obiekt użytkownika

+4

Jest to jedno z możliwych rozwiązań, ale nie zostanie ono zapisane w sesji, więc jeśli otworzysz nową kartę i przejdziesz do witryny, musisz się ponownie zalogować. – voodoogiant

+1

To zostanie zapisane w sesji i będzie działać w kolejnych widokach. Jedynym problemem jest to, że ustawiony backend musi być zawarty w ustawieniu AUTHENTICATION_BACKENDS. Chciałbym móc cofnąć moje poparcie, ale nie mogę. –

+0

@voodoogiant, spotkałem dokładnie ten sam problem, czyli sesja nie jest przechowywana. Ale dość dziwne, pierwsze 2 żądania XHR mogły poprawnie uzyskać dane sesji z identyfikatora sesji. Jednak późniejsze żądanie XHR nie powoduje, a serwer Django ustawia identyfikator sesji w pliku cookie na pusty łańcuch w odpowiedzi. Wiesz dlaczego? i jak to rozwiązać? – jcyrss

19

To proste napisać zwyczaj wsparcie uwierzytelniające dla tego. Jeśli tworzysz yourapp/auth_backend.py o następującej treści:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 


class PasswordlessAuthBackend(ModelBackend): 
    """Log in to Django without providing a password. 

    """ 
    def authenticate(self, username=None): 
     try: 
      return User.objects.get(username=username) 
     except User.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

Następnie dodać do settings.py:

AUTHENTICATION_BACKENDS = (
    # ... your other backends 
    'yourapp.auth_backend.PasswordlessAuthBackend', 
) 

Pana zdaniem, można zadzwonić uwierzytelniania bez hasła:

user = authenticate(username=user.username) 
login(request, user) 
+12

Działa to świetnie, ale uważaj - jeśli chcesz używać zwykłego uwierzytelniania w niektórych sytuacjach, a także uwierzytelniania bez hasła w innych, pamiętaj, aby uniemożliwić nowemu backendowi wykonanie każdej próby z prawidłową nazwą użytkownika, aby odnieść sukces - pamiętaj, że wszystkie serwery są wypróbowany, gdy wywoływana jest metoda authenticate(). W moim wymagam specjalnego argumentu tokena, aby zapewnić, że wywołujący uwierzytelnianie() naprawdę chciał uwierzytelniania bez hasła do pracy. – Richard