2011-01-21 10 views
9

Sto scrivendo un'app per Facebook che connette l'utente dopo aver autenticato la sessione su Facebook, la domanda è: come posso autenticare l'utente su django dopo aver ottenuto l'oggetto utente?Come autenticare manualmente dopo aver ottenuto l'utente django?

user = User.objects.get(email=email) 
user = authenticate(username=user.username, password=user.password) 
login(request, user) 

C'è un altro modo per raggiungere questo obiettivo?

risposta

17

In realtà non c'è bisogno di autenticare() prima se si esegue questa operazione (ma io non ti ho detto!):

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

login(request, user)

+0

Questo lavoro, ma è sbagliato per usarlo ? – marman

+1

Non che io sappia. Solo trixie! –

+0

Se l'unico punto di accesso all'applicazione è la vista in cui si sta effettuando questa operazione, non è male. Se vuoi che la pagina di login dell'amministratore o altri usi del sistema di autenticazione Django funzionino, dovresti davvero utilizzare un back-end di autenticazione. – SeanOC

1

authenticate() e login() ogni forniscono compiti diversi, ed entrambi (o l'equivalente tirato dal codice di Django e aggiornato per ogni versione di Django) sono necessari al fine di accedere un utente in.

4

ci sono due cose a cui dovresti guardare ed essere consapevoli in base alla tua domanda ed esempio.

In primo luogo, il modo in cui vengono gestiti i metodi di autenticazione alternativi (ad esempio Facebook oauth) sono authentication backends. Puoi guardare djangopackages.com per le opzioni esistenti o scriverne uno tuo. Il backend (s) che hai configurato sono ciò che definirà quali parametri authenticate() si aspetta di ricevere (ad esempio, un backend di Facebook non si aspetterebbe una password come password non ha senso in quel contesto).

In secondo luogo, facendo user.password non si ottiene la password effettiva dell'utente. Come misura di sicurezza, Django memorizza le password come salted one-way hashes. Ciò significa che, in base alla progettazione, non è possibile determinare la password di un utente in base a ciò che è memorizzato nel database.

Problemi correlati