Ember simple auth 1.0.1自定义身份验证器

时间:2015-11-30 15:51:42

标签: ember.js ember-data ember-simple-auth

我正在将我在ember-simple-auth:0.8.0中完成的现有代码更新为ember-simple-auth:1.0.1

有两个问题

  1. 不会持续会话
  2. REST调用需要withCredentials:true,不知道我可以在哪里设置它们。
  3. 这是我的代码

    //config/environment.js
      ENV['ember-simple-auth'] = {
        store: 'simple-auth-session-store:local-storage',
        authorizer: 'authorizer:custom',
    
        routeAfterAuthentication: '/dashboard',
        routeIfAlreadyAuthenticated: '/dashboard'
      };
    

    我的身份验证员

    //authenticators/custom.js
    import Ember from 'ember';
    import Base from 'ember-simple-auth/authenticators/base';
    import config from '../config/environment';
    
    export default Base.extend({
      restore(data) {
        return new Ember.RSVP.Promise(function (resolve, reject) {
          if (!Ember.isEmpty(data.token)) {
            resolve(data);
          }
          else {
            reject();
          }
        });
      },
    
      authenticate(options) {
        return new Ember.RSVP.Promise(function(resolve, reject) {
          Ember.$.ajax({
            type: "POST",
            url: config.serverURL + '/api/users/login',
            data: JSON.stringify({
              username: options.identification,
              password: options.password
            }),
            contentType: 'application/json;charset=utf-8',
            dataType: 'json'
          }).then(function(response) {
            Ember.run(function() {
              resolve(response);
            });
          }, function(xhr) {
            Ember.run(function() {
              reject(xhr.responseJSON || xhr.responseText);
            });
          });
        });
      },
    
      invalidate(data) {
        return new Ember.RSVP.Promise(function(resolve, reject) {
          Ember.$.ajax({
            type: "POST",
            url: config.serverURL + '/api/users/logout'
          }).then(function(response) {
            Ember.run(function() {
              resolve(response);
            });
          }, function(xhr) {
            Ember.run(function() {
              reject(xhr.responseJSON || xhr.responseText);
            });
          });
        });
      }
    });
    

    我的授权人(您可以看到我正在尝试更新旧代码)

    //authorizers/custom.js
    import Ember from 'ember';
    import Base from 'ember-simple-auth/authorizers/base';
    
    export default Base.extend({
      authorize(sessionData, block) {
        if (!Ember.isEmpty(sessionData.token)) {
          block('X-CSRF-Token',  sessionData.token);
          block('Content-Type',  'application/json;charset=utf-8');
          block('withCredentials', true);
        }
      }
    
      //authorize(jqXHR, requestOptions) {
      //  if (!(requestOptions.data instanceof FormData)){
      //    requestOptions.contentType = 'application/json;charset=utf-8';
      //  }
      //
      //  requestOptions.crossDomain = true;
      //  requestOptions.xhrFields = {
      //    withCredentials: true
      //  };
      //
      //
      //  var token = this.get('session.token');
      //  console.error(jqXHR);
      //  if (this.get('session.isAuthenticated') ) {
      //    jqXHR.setRequestHeader('X-CSRF-Token', token);
      //  }
      //}
    });
    

    我的应用程序适配器

        import DS from 'ember-data';
        import config from '../../config/environment';
        import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin';
    
        export default DS.RESTAdapter.extend(DataAdapterMixin, {
            authorizer: 'authorizer:custom',
            namespace: 'api',
            host: config.serverURL,
        });
    

    仪表板

        import Ember from 'ember';
    
        import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
    
        export default Ember.Route.extend(AuthenticatedRouteMixin, {
            session: Ember.inject.service('session'),
    
            needs: 'application',
            setupController: function(controller, model){
                this.controllerFor('application').set('pageTitle', 'Dashboard');
                this._super(controller, model);
            }
        });
    

    如果我console.log(this.get('session.isAuthenticated');它返回我是真的,但是当我在模板中使用它时它不起作用

        {{#if session.isAuthenticated}}
            1
        {{else}}
            0
        {{/if}}
    

    在我的laravel结束时,我可以看到会话已创建并且用户已登录,在Ember方面,它先前已设置会话,然后根据每个请求重新发送凭据。现在它发送另一个请求。我认为它没有credentials: True并且laravel返回401.我也尝试发送垃圾标头和laravel CORS拒绝它不在允许的标头中。

    谢谢

1 个答案:

答案 0 :(得分:0)

由于自动授权已被删除,因此1.0中的授权程序配置设置不再存在。有关如何向传出请求添加授权的信息,请参阅API文档:

此外,您的授权人不应多次调用该块,而应仅调用一次,一次传递所有授权数据。

还要确保将会话服务注入到您使用会话的模板的所有控制器和组件中。