JSONをヘッダーに含めない基本的なHTTP認証? (Backbone.jsからRailsサーバーへ)
-
11-10-2019 - |
質問
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);
}
});