質問

私はすでに配備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時間を節約することができます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top