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