0

Ruby On Rails 2.3.8 と HTTParty gem を使用して API に接続したいと考えています。

私のモデルは次のとおりです。

class Onnion < ActiveRecord::Base
  require 'net/http'
  include HTTParty

  base_uri 'http://myapiurl.com'
  digest_auth 'user', 'password'
  disable_rails_query_string_format

  def self.create_rma(order)

    put('/orders/rma', :query => {:action => 'put', :data => {:api_key => 'user', :onnion_order_id => order.id, :customer_rma => order.saving.profile.user.id, :comments => ''}})
  end
end

私がやりたいことは、パラメーター内にグループ化された特定のパラメーターを使用して、Put と呼ばれる API のメソッドを呼び出すことdataです。

このメソッドを実行した後、401 Unauthorizedエラー メッセージが表示されます。

私は何を間違っていますか?私がこのようなことをやろうとしているのはこれが初めてです。

4

1 に答える 1

0

使用している HTTParty のバージョンと、Github の最新バージョンを使用してみましたか? バージョン の少し前に、ダイジェスト認証セキュリティに関するいくつかの修正がありました0.7.3

それでもうまくいかない場合は、通信しようとしているサーバーがプロトコルに正しく従っていない可能性があります。以前にこれが発生したことがあり、正しくログインできるようにするには、HTTParty にモンキー パッチを適用する必要がありました。使用したパッチをここに置きます...

module Net
  module HTTPHeader
    class DigestAuthenticator
      # use NC = 1 instead of 0
      def authorization_header
        @cnonce = md5(random)
        header = [%Q(Digest username="#{@username}"),
          %Q(realm="#{@response['realm']}"),
          %Q(nonce="#{@response['nonce']}"),
          %Q(uri="#{@path}"),
          %Q(response="#{request_digest}")]
        [%Q(cnonce="#{@cnonce}"),
          %Q(opaque="#{@response['opaque']}"),
          %Q(qop="#{@response['qop']}"),
          %Q(nc="1")].each { |field| header << field } if qop_present?
        header
      end

    private
      def request_digest
        a = [md5(a1), @response['nonce'], md5(a2)]
        a.insert(2, "1", @cnonce, @response['qop']) if qop_present?
        md5(a.join(":"))
      end
    end
  end
end

module HTTParty
  class Request
    def setup_digest_auth
      # issue a get instead of a head request
      res = http.get(uri.request_uri, options[:headers]||{})
      if res['www-authenticate'] != nil && res['www-authenticate'].length > 0
        @raw_request.digest_auth(username, password, res)
      end
    end
  end
end

行われた変更は、NC 0 ではなく NC 1 を送信すること、および HEAD リクエストではなく GET リクエストを行うことでした。setup_digest_auth

于 2011-06-28T15:52:06.510 に答える