Ember数据REST适配器中的基本HTTP身份验证

时间:2013-11-15 00:19:18

标签: ember.js ember-data basic-authentication

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"
    ...

3 个答案:

答案 0 :(得分: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
  )
)

答案 1 :(得分:2)

您可以使用$.ajaxPrefilter吗? e.g。

Ember.$.ajaxPrefilter (options) ->
  options.xhrFields = { withCredentials: true }
  options.username = 'fooUsername'
  options.password = 'barPassword'
  true # need to return non-falsy here

答案 2 :(得分:2)

正如@ gerry3所述,$.ajaxPrefilter是一个有效的解决方案。

但是如果你想解决在事件发生后动态更改标题的问题,例如LOGIN尝试成功,那么你需要添加更多的电汇。在我的情况下,我需要发回一个成功的AJAX登录后服务器提供的“令牌”标题。但是,当然,当用户启动应用程序时,他还没有登录。

问题在于,一旦重新打开扩展 RESTAdapter,或者定义 ajaxPrefilter ,即使您将其绑定到value(或我的情况下为localStorage)类不会跟随当前变量值。这就像是在某个时刻拍摄的快照。所以它在我的场景中毫无用处。

我正在关注Embercast Client Authentication,这是一个好的开始(code available),但我没有使用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将其发送给服务器。

希望这有助于某人。