1

ember-data 1.0.0-beta.8 では、ember-simple-auth は他のリクエストを行う前に API から現在のユーザーを読み込みます。これにより、現在のユーザー データが他のルートで利用できることが保証されます。ember-data 1.0.0-beta.9 にアップグレードした後、他の API リクエストを行った後に現在のユーザーを読み込みます。

ember-data 1.0.0-beta.9 を使用して、他のデータの前にember-simple-auth が現在のユーザーをロードするように強制する方法はありますか?

次のようなカスタム簡易認証セッション:

import SimpleAuthSession from 'simple-auth/session';

export default SimpleAuthSession.extend({
  updateCurrentUser: function() {
    var self = this;
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
      self.set('currentUser', self.container.lookup('store:main').find('current-user', userId));
    }
  }.observes('user_id')
});

私の認証イニシャライザ:

import MyAppSession from 'my-app-ember/lib/my-app-session';
import FacebookAuthenticator from 'my-app-ember/lib/facebook-authenticator';

export default {
  name: 'authentication',
  before: 'simple-auth',

  initialize: function(container) {
    container.register('session:my-app-session', MyAppSession);
    container.register('simple-auth-authenticator:facebook', FacebookAuthenticator);

    window.ENV = window.ENV || {};

    window.ENV['simple-auth'] = {
      session: 'session:my-app-session',
      authorizer: 'simple-auth-authorizer:oauth2-bearer',
      routeAfterAuthentication: 'moments'
    };

    window.ENV['simple-auth-oauth2'] = {
      serverTokenEndpoint: MyAppEmberENV.API_NAMESPACE + '/oauth/token'
    };
  }
};

afterModel フックでセッションに設定される currentUser オブジェクトに依存していて、アップグレード後に壊れた場所の例を次に示します。

export default Ember.Route.extend({
  model: function() {
    return this.store.find('moment');
  },

  afterModel: function() {
    if (!this.get('session.currentUser.isReturningUser')) {
      this.transitionTo('settings');
    }
  }
});
4

3 に答える 3

2

私は似たようなことをしていますが、ベータ 9 ではこの問題はありません。simple-auth init の前に実行できるように、初期化子でこのロジックを実行してみてください。

import Ember from 'ember';                               
import Session from 'simple-auth/session';               
import Authorizer from 'myapp/authorizers/custom';

export default {
  name: 'simple-auth-config',       
  before: 'simple-auth',            
  initialize: function(container) { 
    container.register('authorizer:custom', Authorizer);                                

    window.ENV = window.ENV || {};                                                      
    window.ENV['simple-auth'] = {                                                       
      authorizer: 'authorizer:custom',                                                  
      crossOriginWhitelist: [MyappENV.API_HOST]
    };                                                                                  

    window.ENV['simple-auth-oauth2'] = {                                                
      serverTokenEndpoint: MyappENV.API_HOST + '/token'                             
    };                                                                                  

    Session.reopen({                                                                    
      currentUser: function() {                                                         
        var userId = this.get('user_id');                                               
        if (!Ember.isEmpty(userId)) {                                                   
          return container.lookup('store:main').find('user', userId);                   
        }                                                                               
      }.property('user_id')                                                             
    });
  }
}                                                                                 

```

于 2014-08-21T15:59:53.180 に答える
2

他の API リクエストが行われる前にユーザーが正常に読み込まれたことを確認する必要がある場合は、準備を延期し、ユーザーが正常に読み込まれた後にのみ準備を進めるカスタム初期化子を追加する必要があります。

// app/initializers/session-user.js
export default {
  name:       'session-user',       
  after:      'simple-auth',            
  initialize: function(container, application) { 
    var session = container.lookup('simple-auth-session:main');
    if (session.get('isAuthenticated')) {
      application.deferReadiness();
      session.get('currentUser').then(function() {
        application.advanceReadiness();
      }, function() {
        //handle error...
      });
    }
  }
}
于 2014-09-01T06:32:56.890 に答える