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

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top