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'' }
.