2011-08-02 7 views
0

私はOAuthを私のプロジェクト内で使用しています。私は認証の問題に遭遇しました。PUTでOAuth認証に失敗しました

Oauthの認証メカニズムを "POST"メソッドで渡すことはできますが、 "PUT"メソッドではできません。 POSTリクエストとPUTリクエストの唯一の違いは、メソッドタイプです。本文とヘッダーは同じです。

POST

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

PUT

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

クライアントはOAuthのクライアントで次のように私が使用した要求があります。

サーバによって返されたエラーメッセージがある:

enter image description here

FYI:401不正禁止403に類似するが、具体的に使用するための

認証が可能であるが、故障しているか、まだ提供されていません

私は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) 

誰もが考えていますか?

+0

エラーが発生していますか?私は質問にあなたを助けることができる十分な情報があるとは思わない。 – diagonalbatman

+0

@diagonalbatman私はサーバー側から受け取った答えを追加しました。 – Mathieu

+0

特定のエラーが返されますか?私はあなたのコードをもっと見る必要があると思います。 – diagonalbatman

答えて

1

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

+0

あなたの答えをありがとう。実際には、私はPythonを使用してoauthクライアントを作成しました。メソッドが "post"のときは、client.requestはoauthパラメータを設定するように見えます。 "put"の場合、私はこれを手動で行い、それが機能します。奇妙な! Btw、oauthのtutoのおかげで。 – Mathieu

関連する問題