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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top