2011-09-09 13 views
12

Cuando el usuario se autentica en Django, ¿cómo puedo verificarlo desde tastypie?¿Cómo verifico que el usuario ya se haya autenticado desde tastypie?

Una vez que el usuario inicia sesión, la vista incluye algunos JS que extraen datos de la API, que está respaldado por tastypie.

Tengo la autenticación básica/autorización djan establecida en mis recursos, por lo que el navegador muestra la ventana http auth. Hay alguna manera de evitar esto?

Mi idea hasta el momento es ampliar BasicAuthentication para que primero compruebe los datos de la sesión y cuando no lo encuentre, vuelva a http auth? Las llamadas AFAIK AJAX incluyen cookies de sesión, ¿así que esto en teoría debería funcionar? Alguien ha hecho algo similar?

Respuesta

10

que tienen esta solución hasta el momento:

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) 

que parece hacer lo que quiera. Si el usuario ha iniciado sesión, la sesión contiene _auth_user_id, de lo contrario, falta la clave.

¿Alguien puede pensar en algún problema que pueda causar este enfoque?

+0

Funciona para nosotros, gracias! –

9

Es posible que desee echa un vistazo a este billete en GitHub de tastypie:

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

El autor sugiere un enfoque muy limpio para autenticar la llamada tanto con la sesión y la API de métodos clave.

Ahí va el fragmento:

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

¿Por qué no tan simple como la siguiente:

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

acabo de empezar a aprender tastypie. el código anterior parecía funcionar para mí. ¿Alguna ventaja de tu solución?

+1

Creo que esto solo funcionará si la solicitud ya está autenticada y se ha establecido una cookie de sesión. Si envía una solicitud con el conjunto de encabezado HTTP Auth básico, esto fallará, porque no hay sesión y no se llama al método super clase 'is_authenticated', que se supone que maneja esta situación. – rytis

+0

Gracias Pulegium. "Creo que esto solo funcionará si la solicitud ya está autenticada", ¿no se espera que funcione de esta manera para acceder a una API de forma programática? ¿Cuál es la mejor práctica en lo que respecta a la autenticación? Actualmente tengo una api de inicio de sesión independiente que autentica al usuario. Solo el usuario que aprueba exitosamente la API de inicio de sesión puede usar la otra API relajante. No estoy seguro si esta práctica está bien. –

+0

BTW, en mi inicio de sesión api inicie la cookie de sesión –

1

Una vez que el usuario ha iniciado sesión a través de su API, tiene una sesión de usuario de Django. Si desea verificar si el usuario aún está conectado (en la página de actualización, por ejemplo). Que puede hacer: cheque

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 
    } 
}); 
Cuestiones relacionadas