0

DjangoWebサービスでAmazonがS3で行うことを模倣する認証スキームを実装しました。各リクエストはシークレットを使用して署名されます。署名する文字列には、特にアクセスされているリソースのURLが含まれます。

たとえば、クライアントがhttp://myservices.org/usersstring_to_signに対してGETリクエストを発行する場合、クライアントはを含むを構築する必要がありますhttp://myservices.org/usersstring_to_signサーバーがリクエストを処理するとき、サーバーはWSGIラッパーリクエストオブジェクトから学習した情報に基づいて、を構築し、同じURLを含めることができます。

私の問題は、クライアントがポート番号(たとえば)を含めることを決定した場合、クライアントによって使用された実際のURLを取得する方法がわからないためhttp://myservices.org:80/users、サーバーコードが正しくないものを構築することです。string_to_signWSGIラッパーは、URLにポート番号が含まれていることを通知しません。

DjangoアプリケーションがHTTPリクエストの一部であった実際のURLを学習する方法はありますか?生のHTTPリクエストにアクセスしてURLを自分で引き出すために、WSGIラッパーの前にあるある種のリクエストハンドラーを設定する必要がありますか?

4

2 に答える 2

1

さまざまなブラウザやHTTPバージョンで常に機能するとは限りませんが、を使用できますrequest.META['HTTP_HOST']。現在の私のローカル開発サーバーの場合、これは「localhost:8000」を返します。これを中央のコロンで分割して、両方の部分を別々に取得できます。

get_host()さらに、 HttpRequestクラスのメソッドでいくつかの使用法が見つかる場合があります。Djangoのドキュメントから:

HTTP_X_FORWARDED_HOST(USE_X_FORWARDED_HOSTが有効になっている場合)およびHTTP_HOSTヘッダーからの情報をこの順序で使用して、要求の発信元ホストを返します。それらが値を提供しない場合、メソッドは、PEP 3333で詳述されているように、SERVER_NAMEとSERVER_PORTの組み合わせを使用します。

例:「127.0.0.1:8000」

于 2012-07-06T13:14:47.740 に答える
1

あなたは不可能を求めています。あなたが持っているのは、ネットワークの場所 (ホスト名とポート番号) を含まない要求の最初の行だけです。通常、ポート番号が含まれている場合と含まれていない場合がある Host ヘッダー (HTTP 1.0 以上) を取得します。

Amazon のものと非常によく似たスキームを実装する django-fost-authn を見たいと思うかもしれません。

それを使用せず、独自のものを好む場合でも、署名前の計算でリクエストの正規化がどのように行われるかを確認できるはずです。最も適切な観察は、HTTP 要求自体の内部の要素のみを使用することです。これにより、カスタム ヘッダーを署名付きヘッダー セットに含めることができます。また、ホスト ヘッダーが署名されている必要があると主張することもできます。

特に、ドキュメントが fost-authn/signature.py でどのように生成されるかを見てください。

于 2012-07-06T05:15:17.190 に答える