JSONをヘッダーに含めない基本的なHTTP認証? (Backbone.jsからRailsサーバーへ)

StackOverflow https://stackoverflow.com/questions/4463162

質問

backbone.jsを使用して、JSON APIを使用してRailsアプリの純粋なJSフロントエンドを作成しています。

Backbone.jsモデルURLは次のようになります。

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://localhost:3000/medication_options'
});

CRUDはこれで正常に動作します。 「アプリケーション/JSON」コンテンツタイプを使用して、私のサーバーにリクエストを送信しています。

しかし、APIに認証を追加する必要があり、RailsアプリはAuthLogicを使用しているため、これを追加しました。

  before_filter :require_user

     def require_http_auth_user
        return true if current_user
        authenticate_or_request_with_http_basic do |email, password|
          email = email.gsub("_at_", "@") if email.include?("_at_")
          if @current_user = User.find_by_email(email)
            @current_user.valid_password?(password)
          else
            false
          end
        end
      end

そして、Railsの典型的なCRUDメソッドは次のように見えます:

  def update
    @medication_option = MedicationOption.find(params[:id])
    if @medication_option.update_attributes(params[:medication_option])
      flash[:notice] = "Successfully updated medication."
    end
    respond_with @medication_option
  end

したがって、backbone.jsモデルで、URLに「ユーザー名:パスワード」を追加しました。

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://username:password@localhost:3000/medication_options'
});

認証は適切な資格情報で正常に機能しますが、何らかの理由ですべてのBackBone.JS要求は、RailsサーバーによってJSONの代わりにHTMLとして解釈されます。

何らかの理由で、基本的なHTTP認証中に、JSONヘッダーがミックスで迷子になります。

したがって、このようなURLの最後に「.json」を明示的に追加した場合:

window.MedicationCollection = Backbone.Collection.extend({
  model: Medication,
    url: 'http://username:password@localhost:3000/medication_options.json'
});

基本的なGETリクエストを機能させることができます。

しかし、私がCrudを行うとき、それはURLの最後にIDを追加するため、それは機能しません。

ActionController::RoutingError (No route matches "/medication_options.json/41516")

だからここからどこへ行くべきかわからない。

役に立ちましたか?

解決

あなたの.JSONは、JSONと解釈されるために、常にURLの終わりにいる必要があります:

/medication_options/41516.json

JSONを適切な場所に置くために必要な場合、モデルURLとコレクションURLを編集できます。

根本的な問題は、そもそもJSONとして処理されない理由です。 Rails 3を使用している場合は、次のことがありますか:

respond_to :js 

また

respond_to :json

Respons_withと一致し、コントローラーがこの種のフォーマットを受け入れることを確認するために(それ以外の場合はRailsがデフォルトで406エラーを返します)。

他のヒント

document.jsを使用したことはありませんが、ドキュメントを調べると、オーバーライドできるようです url 関数の結果を文字通りの文字列値を与える代わりに返します。追加してもらえますか .json そのようにURL文字列の最後まで?

このようなことを試してみてください:

 _.extend(Medication, 
    {extension:'.json',
     url:function() {
          var base = getUrl(this.collection);
          if (this.isNew()) return base + this.extension;
          return (base + (base.charAt(base.length - 1) == '/' ? '' : '/')
                  + this.id + this.extension);
        }
    });
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top