Come posso controllare quell'utente già autenticato da Tastypie?
Domanda
Quando l'utente autentica in Django, come posso controllarlo da Tastypie?
Una volta che l'utente accede, la vista include alcuni JS che estraggono i dati dall'API, che è supportato da Tastypie.
Ho l'autenticazione di base/djangoauthorizzazione impostata sulle mie risorse, quindi il browser fa esplodere la finestra di autenticazione HTTP. C'è un modo per evitarlo?
La mia idea finora è quella di estendere la autenticazione di basica in modo che controlli prima i dati della sessione e quando non lo trovi, ricade su HTTP AUTH? Le chiamate Afaik Ajax includono i cookie di sessione, quindi questo in teoria dovrebbe funzionare? Qualcuno ha fatto qualcosa di simile?
Soluzione
Finora ho questa soluzione:
class MyBasicAuthentication(BasicAuthentication):
def __init__(self, *args, **kwargs):
super(MyBasicAuthentication, self).__init__(*args, **kwargs)
def is_authenticated(self, request, **kwargs):
from django.contrib.sessions.models import Session
if 'sessionid' in request.COOKIES:
s = Session.objects.get(pk=request.COOKIES['sessionid'])
if '_auth_user_id' in s.get_decoded():
u = User.objects.get(id=s.get_decoded()['_auth_user_id'])
request.user = u
return True
return super(MyBasicAuthentication, self).is_authenticated(request, **kwargs)
che sembra fare quello che voglio. Se l'utente viene effettuato l'accesso, la sessione contiene _auth_user_id
, in caso contrario, la chiave manca.
Chiunque può pensare a eventuali problemi che questo approccio può causare?
Altri suggerimenti
Potresti voler dare un'occhiata a questo biglietto sul github di Tastypie:
https://github.com/toastdriven/django-tastypie/issues/197
L'autore suggerisce un approccio molto pulito per autenticare la chiamata sia con i metodi chiave della sessione che con API.
Ecco lo snippet:
class ApiKeyPlusWebAuthentication(ApiKeyAuthentication):
def is_authenticated(self, request, **kwargs):
if request.user.is_authenticated():
return True
return super(ApiKeyPlusWebAuthentication, self).is_authenticated(request, **kwargs)
def get_identifier(self, request):
if request.user.is_authenticated():
return request.user.username
else:
return super(ApiKeyPlusWebAuthentication, self).get_identifier(request)
Una volta effettuato l'accesso all'utente tramite la tua API, hai una sessione utente Django. Se si desidera verificare se l'utente è ancora effettuato l'accesso (ad esempio aggiornamento della pagina). Tu puoi fare:
from tastypie.resources import Resource
class LoggedInResource(Resource):
class Meta:
pass
def get_list(self, request, **kwargs):
from django.http import HttpResponse
if request.user.is_authenticated():
return HttpResponse(status=200)
else:
return HttpResponse(status=401)
Controllo del cliente:
$.ajax({
type: "GET",
url: '/api/loggedin/',
success: function(data) {
// logged in
},
error: function() {
// not logged in
}
});
PULEGIO
Perché non solo semplice come i seguenti:
class CommAuthentication(BasicAuthentication):
def __init__(self, *args, **kwargs):
super(CommAuthentication, self).__init__(*args, **kwargs)
def is_authenticated(self, request, **kwargs):
return request.user.is_authenticated()
Comincio a imparare le Tastypie. Il codice sopra mi è sembrato funzionare per me. Qualche vantaggio della tua soluzione?