python django tastypie

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



django tastypie (2)

Esta actualización elimina 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)

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

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 con "error_message": "column username is not unique" . Solo tengo un nombre de usuario en el archivo db y es el usuario al que intento autenticar.

¿Alguna idea de por qué devuelve 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 está autenticando. Esto surgirá en la capa DB, como habrás notado, que ese 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 pasan 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<resource_name>%s)/login%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view(''login''), name="api_login"), url(r''^(?P<resource_name>%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 una POST a http://hostname/api/user/login con los datos { ''username'' : ''me'', ''password'' : ''l33t'' } .