2008-12-17 10 views
3

Je crée une application en .NET qui servira de deuxième interface utilisateur pour mon application Django déjà déployée. Pour certaines opérations, les utilisateurs doivent s'authentifier (en tant qu'utilisateurs Django). Étape 1: J'ai créé une vue django qui accepte le nom d'utilisateur et le mot de passe via deux paramètres HTTP GET et les transmet à django.contrib. .auth.authenticate() comme arguments de mot-clé. Voir le code ci-dessous: Authentification Django depuis .NET en utilisant HttpWebRequest et HttpWebResponse via HTTP POST

 
    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")

Étape 2. J'ai appelé cela en utilisant le code suivant dans .NET. Le « strAuthURL » dans le representes suite à une URL simple de django mis en correspondance avec la vue django ci-dessus:

 
    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()

Cela fonctionne parfaitement, bien qu'il ne soit rien de plus qu'une preuve de concept.

Maintenant, je veux le faire via HTTP POST, donc je l'ai fait ce qui suit: -

J'ai créé une vue django pour l'authentification à faire en utilisant les données 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

Le serveur me donne une erreur interne de 500 serveurs. Ma conjecture est que la demande POST n'est pas correctement définie dans .NET. J'ai donc besoin de quelques conseils sur la façon d'appeler la vue django à partir de .NET en envoyant des données POST.

Merci, CM

Répondre

2

semble correct pour moi. Je recommande d'utiliser Wireshark pour voir ce que votre client envoie dans les en-têtes et voir ce que votre application envoie dans les en-têtes.

2

Si vous ne faites aucun partage de session entre les deux sites et que le site .Net a accès à la base de données de l'application Django, vous pouvez vous authentifier directement sur la base de données. This question est sur la façon d'aller de Python à. Net mais il devrait vous aider lorsque vos hachages ne correspondent pas exactement.

0

Cela fonctionne maintenant. Les en-têtes HTTP étaient OK, la source du problème étaient les lignes suivantes:

 
    Dim encoding As New UnicodeEncoding 
    . 
    Dim postBytes As Byte() = encoding.GetBytes(postData)

Essentiellement, cela résultait en un flux de données avec des octets nuls entre les octets de caractères. Ce n'est bien sûr pas ce que l'authentification Django attend dans les paramètres. Passer à ASCIIEncoding a résolu le problème.

> Ca me va. Je recommande d'utiliser Wireshark pour voir ce que votre client envoie dans les en-têtes et voir ce que votre application envoie dans les en-têtes.

Cela m'a mis sur la bonne voie pour résoudre ce problème. J'ai essayé avec Wireshark, mais j'ai ensuite utilisé le débogueur HTTP qui semblait mieux adapté au travail.

Les bons outils peuvent économiser une heure!

+0

C'est vrai, il existe d'excellents outils de débogage HTTP. Je suis juste habitué à Wireshark, tout le chemin depuis ses jours comme Ethereal. – Strelok