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"
...
答案 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将其发送给服务器。
希望这有助于某人。