Ember.js在RESTAdapter标头中动态设置REST auth-token

时间:2014-09-06 04:20:21

标签: ember.js ember-data

这篇SO帖子(Adding headers after RESTAdapter initialization)是我编写代码的指南:

我的auth REST成功返回一个令牌。我直接使用AJAX而不是通过ember-data coz这只是登录并获得授权令牌(在embercast指南)

  $.ajax({
    type: 'POST',
    contentType: 'application/json',
    url: 'api/auth',
    dataType: "json",
    data: postData,
    success: function(response){
      self.set('errorMessage', response.message);

      if (response.success) {

        self.set('token', response.token);
        self.set('loginstatus', 'success');

        var appController = self.get('controllers.application');
        appController.set('token', response.token);
        App.set('authToken', response.token);

        self.transitionToRoute('/');
      }

      if (response.message) {
        //console.log('login failed');
        //THIS CODE IS FAILED!!!
        //self.get('login').render("login-modal-failed", {
        //  into: 'application',
        //  outlet: 'modal'
        //});
      }
    },
    error: function() {
      alert("An error occurred while processing JSON file.");
    }
  });

登录后,这是Chrome网络信息和受保护的HOME页面。打印授权令牌。 (这只是我的EMBER APP学习和测试

enter image description here

正如您在AJAX代码中看到的,以下是每次用户登录时动态放入RESTAdapter标头的auth令牌的属性设置

App.set('authToken', response.token); 

这是RESTAdapter代码:

App.ApplicationAdapter = DS.RESTAdapter.extend({
   namespace: 'emberauthslimv3/api',

   headers: {
      'AUTH-TOKEN': function() {
         return {
           token : this.get('App.authToken') || localStorage.getItem('token')
         }
       }.property('App.authToken')
   }
});

我已经尝试了各种标题设置的组合,相信我,我现在这样做了大约2天,并且永远不会成功地将标记放入标题中。

当我查看chrome网络信息时,我得到的标题就是这个

AUTH-TOKEN:[object Object]

enter image description here

感谢任何帮助/指示:D

更新

在测试了各种组合并仍然失败后,我放弃并使用最简单的黑客,ajaxPrefiler哈哈。至少它有效:

      if (response.success) {
        Ember.$.ajaxPrefilter(function( options, oriOptions, jqXHR ) {
          jqXHR.setRequestHeader("AUTH-TOKEN", response.token);
        });

        self.transitionToRoute('/');
      }

1 个答案:

答案 0 :(得分:4)

首先,当您拥有Ember文档时,您已经使用了错误的参考链接。问题是ApplicationAdapter中的头实现。您将返回包含每个标头属性的对象。

App.ApplicationAdapter = DS.RESTAdapter.extend({
  headers: function() {
    return {
      "AUTH-TOKEN": Ember.get('App.authToken') || localStorage.getItem('token')
    };
  }.property().volatile()
});

BTW这里是链接。 http://emberjs.com/api/data/classes/DS.RESTAdapter.html#toc_headers-customization