¿Cómo puedo iniciar sesión en django usando tastypie?

Estoy intentando anular is_authenticated en mi autenticación personalizada. Tengo algo simple (para empezar) como esto:

class MyAuthentication(BasicAuthentication): def __init__(self, *args, **kwargs): super(MyAuthentication, self).__init__(*args, **kwargs) def is_authenticated(self, request, **kwargs): return True 

entonces en mi ModelResource tengo

 class LoginUserResource(ModelResource): class Meta: resource_name = 'login' queryset = User.objects.all() excludes = ['id', 'email', 'password', 'is_staff', 'is_superuser'] list_allowed_methods = ['post'] authentication = MyAuthentication() authorization = DjangoAuthorization() 

Sigo recibiendo un error 500 de vuelta con "error_message": "column username is not unique" . Solo tengo un nombre de usuario en la base de datos y es el usuario que estoy intentando autenticar.

¿Alguna idea de por qué está devolviendo este error? ¿Cómo permitiría que un cliente de API inicie sesión?

Gracias por la ayuda.

Su enfoque intentará crear un nuevo usuario con el nombre de usuario con el que se autentica. Esto surgirá en la capa de base de datos, como se habrá dado cuenta, de que tal usuario ya existe.

Lo que desea es crear un UserResource , agregar un método en el que los usuarios puedan publicar e iniciar sesión con datos que pasen en nombre de usuario / contraseña.

 from django.contrib.auth.models import User from django.contrib.auth import authenticate, login, logout from tastypie.http import HttpUnauthorized, HttpForbidden from django.conf.urls import url from tastypie.utils import trailing_slash class UserResource(ModelResource): class Meta: queryset = User.objects.all() fields = ['first_name', 'last_name', 'email'] allowed_methods = ['get', 'post'] resource_name = 'user' def override_urls(self): return [ url(r"^(?P%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('login'), name="api_login"), url(r'^(?P%s)/logout%s$' % (self._meta.resource_name, trailing_slash()), self.wrap_view('logout'), name='api_logout'), ] def login(self, request, **kwargs): self.method_check(request, allowed=['post']) data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json')) username = data.get('username', '') password = data.get('password', '') user = authenticate(username=username, password=password) if user: if user.is_active: login(request, user) return self.create_response(request, { 'success': True }) else: return self.create_response(request, { 'success': False, 'reason': 'disabled', }, HttpForbidden ) else: return self.create_response(request, { 'success': False, 'reason': 'incorrect', }, HttpUnauthorized ) def logout(self, request, **kwargs): self.method_check(request, allowed=['get']) if request.user and request.user.is_authenticated(): logout(request) return self.create_response(request, { 'success': True }) else: return self.create_response(request, { 'success': False }, HttpUnauthorized) 

Ahora puede enviar un POST a http://hostname/api/user/login con datos { 'username' : 'me', 'password' : 'l33t' } .

Esta actualización elimina los problemas de seguridad en el método GET. Funciona en Django 1.5.4.

 class UserResource(ModelResource): class Meta: queryset = User.objects.all() resource_name = 'user' allowed_methods = ['post'] def prepend_urls(self): return [ url(r"^user/login/$", self.wrap_view('login'), name="api_login"), url(r"^user/logout/$", self.wrap_view('logout'), name='api_logout'), ] def login(self, request, **kwargs): self.method_check(request, allowed=['post']) data = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json')) username = data.get('username', '') password = data.get('password', '') user = authenticate(username=username, password=password) if user: if user.is_active: login(request, user) return self.create_response(request, { 'success': True }) else: return self.create_response(request, { 'success': False, 'reason': 'disabled', }, HttpForbidden ) else: return self.create_response(request, { 'success': False, 'reason': 'incorrect', }, HttpUnauthorized ) def logout(self, request, **kwargs): self.method_check(request, allowed=['post']) if request.user and request.user.is_authenticated(): logout(request) return self.create_response(request, { 'success': True }) else: return self.create_response(request, { 'success': False }, HttpUnauthorized)