0

プロジェクト内でOAuthを使用しています。しかし、認証の問題が発生しました。

メソッド「POST」ではOauthの認証機構をパスできるが、メソッド「PUT」ではパスできないということです。POST リクエストと PUT リクエストの唯一の違いはメソッド タイプです。本文とヘッダーは同じです。私が使用したリクエストは次のとおりです。

役職

resp, cont = client.request("http://localhost:8000/api/1.0/booking/",
                            "POST", 
                            data_booking,
                            headers=headers) 

置く

resp, cont = client.request("http://localhost:8000/api/1.0/booking/",
                            "PUT",
                            data_booking,
                            headers=headers)

クライアントは OAuth クライアントです。

サーバーから返されるエラー メッセージは次のとおりです。

ここに画像の説明を入力

参考: 401 Unauthorized

403 Forbidden に似ていますが、特に認証が可能であるが、失敗したか、まだ提供されていない場合に使用します。

私はdjangoフレームワークを使用して開発しています。

リクエスト方法は以下の通りです。

def request(self, uri, method="GET", body=None, headers=None, 
        redirections=httplib2.DEFAULT_MAX_REDIRECTS, connection_type=None,
        callback_url=None, realm=''):
        DEFAULT_CONTENT_TYPE = 'application/x-www-form-urlencoded'

        if not isinstance(headers, dict):
            headers = {}

        is_multipart = method == 'POST' and headers.get('Content-Type', 
            DEFAULT_CONTENT_TYPE) != DEFAULT_CONTENT_TYPE

        if body and (method == "POST" or method == 'PUT') and not is_multipart:
            parameters = dict(parse_qsl(body))
            if callback_url != None:
                parameters['oauth_callback'] = callback_url
        else:
            if callback_url != None and not is_multipart:
                parameters = {'oauth_callback': callback_url}
            else:
                parameters = None

        req = Request.from_consumer_and_token(self.consumer, 
            token=self.token, http_method=method, http_url=uri, 
            parameters=parameters)

        req.sign_request(self.method, self.consumer, self.token)

        if method == "POST" or method == "PUT":
            headers['Content-Type'] = headers.get('Content-Type', 
                DEFAULT_CONTENT_TYPE)
            if is_multipart:
                headers.update(req.to_header(realm))
            else:
                body = req.to_postdata()
        elif method == "GET":
            uri = req.to_url()
        else:
            headers.update(req.to_header(realm))

        return httplib2.Http.request(self, uri, method=method, body=body, 
            headers=headers, redirections=redirections, 
            connection_type=connection_type)

誰にもアイデアがありますか?

4

1 に答える 1

1

一部の OAuth サーバー実装では、HTTP メソッドが POST の場合、署名のベース文字列にフォーム エンコードされた本文パラメーターのみが含まれます。これは OAuth 1.0 では正しい動作でしたが、後のリビジョンで修正されました。本文なしで PUT リクエストを作成してみて、それが役立つかどうかを確認してください。含まれている場合は、サーバー ライブラリのメンテナにこれを修正するよう依頼するか、put を使用するときにフォーム エンコードされた本文が含まれないように呼び出しを制限する必要があります。

于 2011-08-02T16:00:01.620 に答える