password - Django: Rest Framework autentica el encabezado
modelserializer django rest framework (5)
En caso de que alguien más se encuentre con este error. Esto también puede suceder si está ejecutando Django en Apache usando mod_wsgi porque el encabezado de autorización es eliminado por mod_wsgi. Deberá agregar lo siguiente a su configuración VirtualHost:
WSGIPassAuthorization On
Al utilizar la API REST de Django , intento autenticar mi solicitud.
Esto es lo que intento enviar:
Content-Type: application/json, Authentication: token="6d82549b48a8b079f618ee9c51a6dfb59c7e2196"
Esto es lo que recibo:
{"detail": "Authentication credentials were not provided."}
¿Podría alguien darme el encabezado correcto?
Gracias
El encabezado:
Accept: application/json
Content-Type: application/json
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
Settings.py
REST_FRAMEWORK = {
''DEFAULT_PERMISSION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
''rest_framework.permissions.IsAdminUser'',
),
''PAGINATE_BY'': 10
}
view.py
class ProfileList(generics.ListCreateAPIView):
"""
API endpoint that represents a list of users.
"""
permission_classes = (permissions.IsAuthenticated,)
model = Profile
serializer_class = ProfileSerializer
def pre_save(self, obj):
obj.owner = self.request.user
En mi caso, esto funciona:
(Django REST Framework v3)
settings.py
REST_FRAMEWORK = {
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
''rest_framework.authentication.SessionAuthentication'',
),
''DEFAULT_PERMISSION_CLASSES'': (
''rest_framework.permissions.IsAuthenticated'',
),
}
views.py
class Test(APIView):
def get(self, request, format=None):
return Response({''Result'': ''OK''})
urls.py
router.add_api_view(''test'', url(r''^test/'', views.Test.as_view(),name=''test''))
No olvides enviar la información del token en el encabezado:
Key: Authorization
Value: Token 76efd80cd6849ad7d35e04f1cc1eea35bdc20294
Para generar tokens puedes usar lo siguiente (en algún lugar de tu código):
from rest_framework.authtoken.models import Token
user = User.objects.get(username=''<username>'')
token = Token.objects.create(user=user)
print(token.key)
Estaba teniendo el mismo problema con mi Autenticación Token
Esto me solucionó el problema
settings.py
REST_FRAMEWORK = {
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
),
''DEFAULT_PERMISSION_CLASSES'': (
''rest_framework.permissions.IsAdminUser''
),
''PAGINATE_BY'': 10,
}
Para aquellos que están en AWS Beanstalk elástico y que están un poco atrapados con Apache y a menos que tenga
WSGIPassAuthorization On
Como se menciona en @Fiver tus encabezados son eliminados
En lugar de arreglarlo manualmente y hacer una nueva imagen, hice un script que verifica si la última línea del archivo conf es WSGIPassAuthorization On
y si no lo está, lo actualizamos y reiniciamos el servidor
En mi aplicación Django tengo una carpeta de configuración con mi archivo sh
configs / server / update-apache.sh
if [[ $(tac /etc/httpd/conf/httpd.conf | egrep -m 1 .) == $(echo ''WSGIPassAuthorization On'') ]];
then
echo "Httpd.conf has already been updated"
else
echo "Updating Httpd.conf.."
echo ''WSGIPassAuthorization On'' >> /etc/httpd/conf/httpd.conf
service httpd restart
fi
Haz que sea excelente antes de comprometerlo con git
chmod +x configs/server/update-apache.sh
Luego en mi archivo python.config agrego el comando al final
.ebextensions / python.config
...
...
container_commands:
01_migrate:
command: "python manage.py migrate"
leader_only: true
02_collectstatic:
command: "python manage.py collectstatic --noinput"
03_change_perm:
command: "chown -R wsgi:root static"
03_update_apache:
command: "sh configs/server/update-apache.sh"
Ahora, cualquier máquina nueva que se inicie tendrá una verificación para ver si el servidor está actualizado y si es necesario
Suponiendo que está intentando usar TokenAuthentication, el encabezado debería verse así:
Authorization: Token 6d82549b48a8b079f618ee9c51a6dfb59c7e2196
Como se describe en la documentación .