5

Ember.js (および Ember-data) でBasic HTTP Authenticationを必要とする API に資格情報を送信する方法はありますか? JQuery hereでそれがどのように行われるかを見ることができますが、Ember でそれを行う簡単な方法は見当たりません。ヘッダーに何かを追加するとうまくいくと思いましたが(以下のcoffeescriptを参照)、成功しませんでした:

App.AuthAdapter =  DS.RESTAdapter.extend(
    host: 'https://my-api.example.com'
    namespace: 'v1'
    headers:
        "Authorization Basic fooUsername:barPassword"
    ...
4

3 に答える 3

3

デフォルトの Rest アダプターを拡張し、送信される ajax に含まれるヘッダー ハッシュを追加できます。

App.ApplicationAdapter = DS.RESTAdapter.extend(
   headers:
     withCredentials: true
     Authorization: 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='
)

または、さらに一歩進んで ajax メソッドをオーバーライドすることもできます

App.ApplicationAdapter = DS.RESTAdapter.extend(
  ajax: (url, type, hash) ->
    adapter = this
    new Ember.RSVP.Promise((resolve, reject) ->
      hash = hash or {}
      hash.url = url
      hash.type = type
      hash.dataType = "json"
      hash.context = adapter

      if hash.data and type isnt "GET"
        hash.contentType = "application/json; charset=utf-8"
        hash.data = JSON.stringify(hash.data)

      if adapter.headers isnt `undefined`
        headers = adapter.headers
        hash.beforeSend = (xhr) ->
          forEach.call Ember.keys(headers), (key) ->
            xhr.setRequestHeader key, headers[key]

    hash.success = (json) ->
      Ember.run null, resolve, json

    hash.error = (jqXHR, textStatus, errorThrown) ->
      Ember.run null, reject, adapter.ajaxError(jqXHR)

    Ember.$.ajax hash
  )
)
于 2013-11-15T00:54:31.490 に答える
2

使えます$.ajaxPrefilterか?例えば

Ember.$.ajaxPrefilter (options) ->
  options.xhrFields = { withCredentials: true }
  options.username = 'fooUsername'
  options.password = 'barPassword'
  true # need to return non-falsy here
于 2013-11-15T00:54:20.647 に答える
2

@ gerry3が述べたよう$.ajaxPrefilterに、有効な解決策です。

しかし、イベント後にヘッダーを動的に変更するという問題を解決したい場合、たとえばログイン試行の成功など、より多くのワイヤを配置する必要があります。私の場合、AJAX ログインが成功した後にサーバーから提供される「トークン」ヘッダーを送り返す必要があります。しかし、もちろん、ユーザーがアプリを開始するとき、彼はまだログインしていません。

問題は、 RESTAdapter を再度開いたり拡張したり、 ajaxPrefilterを定義したりすると、それを値 (または私の場合は localStorage ) にバインドしている場合でも、クラスが現在の変数 value に従っていないことです。ある瞬間を切り取ったスナップショットのようなものです。したがって、私のシナリオでは役に立ちません。

私は良いスタートであるEmbercast Client Authenticationに従っています(コードが利用可能です)が、jQueryデータフェッチの代わりにEmber-Dataを使用しています。

したがって、トリックは、トークンを観察し、必要な回数 ajaxPrefilter を再定義することです。

tokenChanged: function() {
    this.get('token')=='' ? 
        localStorage.removeItem('token') : 
            localStorage.token = this.get('token');

    $.ajaxPrefilter(function(options, originalOptions, xhr) {
        return xhr.setRequestHeader('Token', localStorage.token);
    });

}.observes('token')

したがって、ユーザーがログインすると、ユーザーは有効なトークンを取得し、RESTAdapter を介してサーバーへのすべての要求でそれを送信します。

これが誰かに役立つことを願っています。

于 2014-04-21T10:29:34.953 に答える