2011-05-20 27 views
7

todos. Estoy intentando escribir pruebas para la API RESTful implementada usando django-tastypie con http auth auth. Por lo tanto, tengo el siguiente código:cliente de prueba Django http autenticación básica para la solicitud

def http_auth(username, password): 
    credentials = base64.encodestring('%s:%s' % (username, password)).strip() 
    auth_string = 'Basic %s' % credentials 
    return auth_string 

class FileApiTest(TestCase): 

    fixtures = ['test/fixtures/test_users.json'] 

    def setUp(self): 
     self.extra = { 
      'HTTP_AUTHORIZATION': http_auth('testuser', 'qwerty') 
     } 

    def test_folder_resource(self): 
     response = self.client.get('/api/1.0/folder/', **self.extra) 
     self.assertEqual(response.status_code, 200) 

    def test_folder_resource_post(self): 
     response = self.client.post('/api/1.0/folder/', **self.extra) 
     self.assertNotEqual(response.status_code, 401) 

petición GET se hace bien, volviendo código de estado 200. Pero petición POST siempre devuelve 401. Estoy seguro de que estoy haciendo algo mal. ¿Algún consejo?

+0

Tal vez verifique su Meta: autorización en su recurso? ¿Qué dice? –

+0

'authorization = DjangoAuthorization()' – dmrz

+2

aw, mierda, quise decir "Autenticación" Eso es lo que estás probando aquí. La diferencia es Autenticación == "¿Quién eres?", Autorización == "¿Puedes hacer esto?" –

Respuesta

4

Echa un vistazo this question. He usado ese código para pruebas usando GET y POST y funcionó. La única diferencia que puedo ver es que ha usado base64.encodestring en lugar de base64.b64encode.

De lo contrario, si eso no funciona, ¿cómo está realizando la Autenticación HTTP? Escribí y uso este decorador de funciones:

import base64 
from django.http import HttpResponse 
from django.contrib.auth import authenticate, login 

def http_auth(view, request, realm="", must_be='', *args, **kwargs): 
    if 'HTTP_AUTHORIZATION' in request.META: 
     auth = request.META['HTTP_AUTHORIZATION'].split() 
     if len(auth) == 2: 
      if auth[0].lower() == "basic": 
       uname, passwd = base64.b64decode(auth[1]).split(':') 
       if must_be in ('', uname): 
        user = authenticate(username=uname, password=passwd) 
        if user is not None and user.is_active: 
          login(request, user) 
          request.user = user 
          return view(request, *args, **kwargs) 

    # They mustn't be logged in 
    response = HttpResponse('Failed') 
    response.status_code = 401 
    response['WWW-Authenticate'] = 'Basic realm="%s"' % realm 
    return response 


def http_auth_required(realm="", must_be=''): 
    """ Decorator that requires HTTP Basic authentication, eg API views. """ 
    def view_decorator(func): 
     def wrapper(request, *args, **kwargs): 
      return http_auth(func, request, realm, must_be, *args, **kwargs) 
     return wrapper 
    return view_decorator 
+0

Uso django-tastypie, tiene autenticación http bash incorporada y funciona bien. No puedo solo hacer solicitudes de publicación con el cliente de prueba django y no tengo idea de dónde está el problema – dmrz

+0

Este archivo parece manejar la autenticación. Eche un vistazo y vea si puede rastrear lo que está pasando mal? https://github.com/toastdriven/django-tastypie/blob/master/tastypie/authentication.py – Humphrey

1

He encontrado una razón de mi problema. DjangoAuthorization comprueba los permisos con el marco de preajustes de django, ya que no los utilizo en mi proyecto: todas las solicitudes de post/put/delete del superusuario no están autorizadas. Mi error.

De todos modos, muchas gracias a ustedes, muchachos, por las respuestas.

+0

¿Cómo lo resolvió? –

Cuestiones relacionadas