Django autenticación de .NET utilizando HttpWebRequest y HttpWebResponse través de HTTP POST
-
22-08-2019 - |
Pregunta
Estoy creando una aplicación en .NET que servirá como una segunda interfaz de usuario para mi aplicación Django ya desplegado. Para algunas operaciones que los usuarios necesitan para autenticar a sí mismos (como usuarios de Django). He utilizado un modo extremadamente simple de hacer esto (sin cifrar las credenciales para simplificar): -
Paso 1. creé una vista de Django que aceptó el nombre de usuario y contraseña a través de dos parámetros HTTP GET y les transmití a django.contrib.auth.authenticate () como argumentos de palabra clave. Ver el código de abajo:
def authentication_api(request, raw_1, raw_2): user = authenticate(username=raw_1, password=raw_2) if user is not None: if user.is_active: return HttpResponse("correct", mimetype="text/plain") else: return HttpResponse("disabled", mimetype="text/plain") else: return HttpResponse("incorrect", mimetype="text/plain")
Paso 2. I llamó a esta usando el siguiente código en .NET. El 'strAuthURL' en el siguiente representes una URL Django sencilla asignada a la vista de Django arriba:
Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest) Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse) Dim reader As StreamReader = New StreamReader(response.GetResponseStream()) Dim result As String = reader.ReadToEnd() HttpWResp.Close()
Esto funciona sin problemas, a pesar de que no es más que una prueba de concepto.
Ahora quiero hacer esto a través de HTTP de POST por lo que he hecho lo siguiente: -
He creado una vista de Django para la autenticación haciendo uso de los datos POST
def post_authentication_api(request): if request.method == 'POST': user = authenticate(username=request.POST['username'], password=request.POST['password']) if user is not None: if user.is_active: return HttpResponse("correct", mimetype="text/plain") else: return HttpResponse("disabled", mimetype="text/plain") else: return HttpResponse("incorrect", mimetype="text/plain")
I have tested this using restclient and this view works as expected. However I can't get it to work from the .NET code below:
Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest) request.ContentType = "application/x-www-form-urlencoded" request.Method = "POST" Dim encoding As New UnicodeEncoding Dim postData As String = "username=" & m_username & "&password=" & m_password Dim postBytes As Byte() = encoding.GetBytes(postData) request.ContentLength = postBytes.Length Try Dim postStream As Stream = request.GetRequestStream() postStream.Write(postBytes, 0, postBytes.Length) postStream.Close() Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse) Dim responseStream As New StreamReader(response.GetResponseStream(), UnicodeEncoding.Unicode) result = responseStream.ReadToEnd() response.Close() Catch ex As Exception MessageBox.Show(ex.ToString) End Try
El servidor me da un error de servidor interno 500. Mi conjetura es que la solicitud POST no está configurado correctamente en .NET. Así que, básicamente, necesito un poco de orientación sobre la forma de llamar a la vista de Django a partir de datos de correos que envía .NET.
Gracias, CM
Solución
Se ve bien para mí. Recomiendo el uso de Wireshark para ver lo que su restclient está enviando en los encabezados y ver qué enviar su aplicación en las cabeceras.
Otros consejos
Si no está realizando sesiones compartidas entre los dos sitios y el sitio .Net tiene acceso a la base de datos de la aplicación Django se podría autenticar directamente contra el PP. Este pregunta es acerca de cómo pasar de Python para .Net pero debe ayudar cuando sus valores hash no coinciden exactamente arriba.
Está funcionando ahora. Las cabeceras HTTP estaban bien, el origen del problema eran las siguientes líneas:
Dim encoding As New UnicodeEncoding . Dim postBytes As Byte() = encoding.GetBytes(postData)
Esencialmente, esto se traduce en un flujo de datos con bytes nulos entre los bytes de caracteres. Que por supuesto no es lo que la autenticación de Django espera en los parámetros. El cambio a ASCIIEncoding resuelto el problema.
> Se ve bien para mí. Recomiendo el uso de Wireshark para ver lo que su restclient está enviando en los encabezados y ver qué enviar su aplicación en las cabeceras.
Esto me partió en el camino correcto hacia la solución de este. Probé con Wireshark, pero luego se usa HTTP depurador que parecía más adecuado para el trabajo.
Las herramientas adecuadas pueden ahorrar una hora!