HTTP POSTを経由してのHttpWebRequestとHttpWebResponseのを使用して、.NETからDjangoの認証
-
22-08-2019 - |
質問
私はすでに配備Djangoアプリケーションのための第二のUIとなる.NETでアプリケーションを作成しています。一部の操作では、ユーザーは、(Djangoのユーザとして)自分自身を認証する必要があります。私は(簡単にするために資格情報を暗号化せずに)これを行うには超簡単な方法を使用: -
ステップ1.私は2つのHTTP GETパラメータによって、ユーザ名とパスワードを受け入れたDjangoのビューを作成し、キーワード引数として()django.contrib.auth.authenticateするためにそれらを渡さ。以下のコードを参照してください。
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")
ステップ2:私は、.NETに次のコードを使用して、これを呼ばれます。以下の「strAuthURLは、」上記のDjangoのビューにマッピングされたシンプルなDjangoのURLをrepresentes:
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()
それは概念実証以外の何ものでもありませんが、
これは、完璧に動作ます。
今、私は次のことを行っているので、HTTP POSTを経由してこれをしたい: -
私は、POSTデータを使用して行う認証のためのDjangoのビューを作成しました
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
サーバーは私に500内部サーバーエラーを与えています。私の推測では、POSTリクエストが正しく.NETで設定されていないということです。だから私は基本的にPOSTデータを送信する.NETからDjangoのビューを呼び出す方法についていくつかのガイダンスを必要とします。
おかげで、 CM
解決
は、私には[OK]を検索します。私はあなたのrestclientがヘッダに送信しているかを見ると、アプリがヘッダーに送信するものを見るためにWiresharkのを使用することをお勧めします。
他のヒント
あなたは、2つのサイト間のいずれかのセッション共有を行っていないと.NETのサイトでは、まっすぐデシベルに対して認証ができDjangoのアプリのDBへのアクセス権を持っている場合。 この質問は、.NETへのPythonから行く方法についてですが、あなたのハッシュが正確に一致しないとき、それはあなたを助ける必要があります。
今は働いています。 HTTPヘッダはOKだった、問題の原因は、次の行は以下の通りでした。
Dim encoding As New UnicodeEncoding . Dim postBytes As Byte() = encoding.GetBytes(postData)
本質的に、これは文字のバイトの間のヌルバイトを有するデータストリームが得られました。もちろんそれは、Djangoの認証パラメータに期待するものではありません。 ASCIIEncodingに変更すると、問題を解決します。
>私には[OK]を検索します。私はあなたのrestclientがヘッダに送信しているかを見ると、アプリがヘッダーに送信するものを見るためにWiresharkの使用をお勧めします。
これは、このトラブルシューティングを行うに向けた正しい道に私をオフに設定します。私はWiresharkので試してみましたが、その後の仕事のために、より適しているように見えたHTTPデバッガを使用します。
適切なツールが1時間を節約することができます!