¿Cómo creo una API de inicio de sesión utilizando Django Rest Framework?

Quiero crear una api de inicio de sesión (o usar una existente si ya está pre-empaquetada) usando el marco de rest de django. Sin embargo, estoy completamente perdido. Cada vez que envío una solicitud de publicación a la url de “inicio de sesión” de django rest framework, simplemente devuelve la página de la plantilla de api navegable …

Mi configuración

urls.py

url(r'^api/v1/', include('rest_framework.urls', namespace='rest_framework')) 

settings.py

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ) } 

LO QUE QUIERO

Solicitud:

 POST /api/v1/login username='name' pass='pass' 

Respuesta:

 200 OK "{username: 'name', 'userId': '54321'}" set-cookie: sessionid="blahblah" 

Echa un vistazo a la vista de la API de django-rest-framework-jwt . Es una implementación para crear tokens de autenticación en lugar de sesiones de cookies, pero su implementación será similar. Ver views.py y serializers.py . Probablemente puede usar el serializers.py sin cambios, y simplemente ajuste sus vistas para devolver los parámetros correctos y posiblemente establecer la cookie de sesión (no se puede recordar si eso ya se realizó en la autenticación).

Si quieres algo como esto, hago lo mismo, pero uso la autenticación Token.

Echa un vistazo a su página de token aquí

Puede que esto no sea lo que quiere, pero la forma en que lo hago es (ya que lo estoy usando como punto final de api para clientes móviles)

Puedo hacer mi url localhost:8000/api/users/ -H Authorization : Token Un navegador podría usar la página de inicio de sesión regular que creas en la url del marco de referencia proporcionado

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')

y para obtener tokens para la navegación sin inicio de sesión

url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')

Luego, si haces llamadas y así puedes pasar los tokens de autorización. Por supuesto, así es como lo hago y probablemente no sea la forma más eficiente, pero mi objective era crear una forma en que pueda proporcionar a los usuarios autenticación de sesión para navegadores y acceso móvil a través de tokens.

Luego, en su views.py, asegúrese de agregar los requisitos de autenticación para esa vista. Casi lo mismo que la sección de autenticación de sesión

permission_classes = (permissions.IsAdminUser,)

pero también incluyen

authentication_classes = (authentication.TokenAuthentication,)

Espero que esto ayude, pero si no, buena suerte en su búsqueda.

Por supuesto, el token es una buena manera de autenticarse, pero el interrogador está preguntando acerca de la autenticación de la sesión.

Solicitud:

 POST /api/v1/login username='username' password='password' 
  • Ponga el valor csrftoken en X-CSRFToken en el encabezado
  • Aunque alguien que usa el email como nombre de usuario registrado, se requiere el parámetro de nombre de username para ingresar el correo electrónico (por ejemplo, username='sample@domain.com' )

Respuesta:

 302 FOUND sessionid="blahblah" 
  • Si no especificó el next valor, se redirigirá automáticamente a /accounts/profile/ que puede generar un error 404

Añadiendo nuestras vistas:

 from rest_framework_jwt.views import refresh_jwt_token urlpatterns = [ ... url(r'^rest-auth/', include('rest_auth.urls')), url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), ... url(r'^refresh-token/', refresh_jwt_token), ]