2011-09-09 10 views
12

Quando l'utente si autentica in Django, come posso verificarlo da tastypie?Come faccio a verificare che l'utente sia già autenticato da tastypie?

Dopo l'accesso, la vista include alcuni JS che estraggono i dati dall'API, supportati da tastypie.

Ho un'autenticazione di base/djangoauthorisation impostata sulle mie risorse, quindi il browser apre la finestra http auth. C'è un modo per evitarlo?

La mia idea è di estendere BasicAuthentication in modo che prima controlli i dati di sessione e quando non li trova, ricade su http auth? Le chiamate AFAIK AJAX includono i cookie di sessione, quindi in teoria dovrebbe funzionare? Qualcuno ha fatto qualcosa di simile?

risposta

10

ho questa soluzione finora:

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 è connesso, la sessione contiene _auth_user_id, in caso contrario, manca la chiave.

Chiunque può pensare a qualche problema che questo approccio potrebbe causare?

+0

Si lavora per noi, grazie! –

9

Si consiglia di controllare questo biglietto su GitHub di tastypie:

https://github.com/toastdriven/django-tastypie/issues/197

L'autore suggerisce un approccio molto pulito per autenticare la chiamata sia con la sessione e l'API metodi chiave.

Ci va il frammento:

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) 
0

Pulegium

Perché non solo come semplice come il seguente:

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() 

ho appena iniziare a imparare tastypie. il codice sopra sembrava funzionare per me. Qualunque vantaggio della tua soluzione?

+1

Penso che funzionerà solo se la richiesta è già autenticata e un cookie di sessione è stato impostato. Se si invia una richiesta con l'intestazione di autenticazione HTTP Basic, questo fallirà, perché non c'è una sessione e non si chiama il metodo super 'is_authenticated', che dovrebbe gestire questa situazione. – rytis

+0

Grazie Pulegium. "Penso che funzionerà solo se la richiesta è già autenticata", non è previsto che funzioni in questo modo per accedere a un'API in modo programmatico? Qual è la migliore pratica per quanto riguarda l'autenticazione? Attualmente ho una API di accesso separata che autentica l'utente. Solo l'utente ha passato con successo l'API di accesso può utilizzare l'altra API riposante. Non sono sicuro se questa pratica è ok. –

+0

BTW, nel mio login API apro il cookie di sessione –

1

Una volta che l'utente ha effettuato il login tramite la tua API, hai una sessione utente Django. Se si desidera verificare se l'utente è ancora connesso (ad esempio, all'aggiornamento della pagina). Si può fare: controllo

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) 

Cliente:

$.ajax({ 
    type: "GET", 
    url: '/api/loggedin/', 
    success: function(data) { 
     // logged in 
    }, 
    error: function() { 
     // not logged in 
    } 
}); 
Problemi correlati