2014-11-03 4 views
0

Использование ember-cli 0.1.2 и ember-cli-simple-auth 0.7.0, мне нужно аннулировать сеанс как на клиенте, так и на сервере. Как пояснил here мне нужно сделать что-то подобное методу authenticate произведя Ajax запрос на сервер и обеспечения его успеха Перед опорожнением сессии:Недействительный сеанс с пользовательским аутентификатором

import Ember from 'ember'; 
import Base from "simple-auth/authenticators/base"; 

var CustomAuthenticator = Base.extend({ 
    tokenEndpoint: 'http://127.0.0.1:3000/api/v1/auth/login', 

    restore: function(data) { 

    }, 

    authenticate: function(credentials) { 
    var _this = this; 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     Ember.$.ajax({ 
     url:   _this.tokenEndpoint, 
     type:  'POST', 
     data:  JSON.stringify({ email: credentials.identification, password: credentials.password }), 
     contentType: 'application/json' 
     }).then(function(response) { 
     Ember.run(function() { 
      resolve({ token: response.token }); 
     }); 
     }, function(xhr, status, error) { 
     var response = JSON.parse(xhr.responseText); 
     Ember.run(function() { 
      reject(response.error); 
     }); 
     }); 
    }); 
    }, 

    invalidate: function() { 
    var _this = this; 
    return new Ember.RSVP.Promise(function(resolve, reject) { 
     Ember.$.ajax({ 
     url: _this.tokenEndpoint, 
     type: 'DELETE' 
     }).then(function(response) { 
     resolve(); 
     }, function(xhr, status, error) { 
     var response = JSON.parse(xhr.responseText); 
     Ember.run(function() { 
      reject(response.error); 
     }); 
     }); 
    }); 
    } 

    // invalidate: function() { 
    // var _this = this; 
    // return new Ember.RSVP.Promise(function(resolve) { 
    //  Ember.$.ajax({ url: _this.tokenEndpoint, type: 'DELETE' }).always(function() { 
    //  resolve(); 
    //  }); 
    // }); 
    // } 
}); 

export default { 
    name : 'authentication', 
    before : 'simple-auth', 
    initialize : function(container) { 
    container.register('authenticator:custom', CustomAuthenticator); 
    } 
}; 

Мой выход из системы API конечной точки необходимо установить маркер (в заголовках). Как передать его? Я прочитал this но мой доверитель, кажется, не обращая внимания, и я получил 401:

import Ember from 'ember'; 
import Base from 'simple-auth/authorizers/base'; 

var CustomAuthorizer = Base.extend({ 
    authorize: function(jqXHR, requestOptions){ 
    Ember.debug("AUTHORIZING!"); 
    } 
}); 

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

Мои environment.js:

/* jshint node: true */ 

module.exports = function(environment) { 
    var ENV = { 
    modulePrefix: 'wishhhh', 
    environment: environment, 
    baseURL: '/', 
    locationType: 'auto', 
    EmberENV: { 
     FEATURES: { 
     // Here you can enable experimental features on an ember canary build 
     // e.g. 'with-controller': true 
     } 
    }, 

    APP: { 
     // Here you can pass flags/options to your application instance 
     // when it is created 
    } 
    }; 

    // TODO: disabled because of https://github.com/stefanpenner/ember-cli/issues/2174 
    ENV.contentSecurityPolicyHeader = 'Disabled-Content-Security-Policy' 

    ENV['simple-auth'] = { 
    authorizer: 'authorizer:custom', 
    // crossOriginWhitelist: ['http://localhost:3000'] 
    crossOriginWhitelist: ['*'] 
    } 

    if (environment === 'development') { 
    // ENV.APP.LOG_RESOLVER = true; 
    ENV.APP.LOG_ACTIVE_GENERATION = true; 
    // ENV.APP.LOG_TRANSITIONS = true; 
    // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; 
    ENV.APP.LOG_VIEW_LOOKUPS = true; 
    } 

    if (environment === 'test') { 
    // Testem prefers this... 
    ENV.baseURL = '/'; 
    ENV.locationType = 'auto'; 

    // keep test console output quieter 
    ENV.APP.LOG_ACTIVE_GENERATION = false; 
    ENV.APP.LOG_VIEW_LOOKUPS = false; 

    ENV.APP.rootElement = '#ember-testing'; 
    } 

    if (environment === 'production') { 

    } 

    return ENV; 
}; 

Ниже выходной инспектор Ember, когда, в конце концов, я пытаюсь выйти из системы: enter image description here

+0

BTW: вам необходимо установить метод «восстановления» аутентификатора – marcoow

ответ

0

Благодаря marcoow я узнал, что на самом деле это проблема с каждым запросом не только с выходом из системы. Мой авторизатор так и не получил. Проблема заключалась в настройке среды crossOriginWhitelist, которая, чтобы работать с моим API-интерфейсом, мне пришлось установить значение ['http://127.0.0.1:3000']. Ни ['http://localhost:3000'], ни [*] не работал.

0

Вы действительно настроили Ember Simple Auth, чтобы использовать свой собственный авторизатор? В этом случае он должен автоматически авторизовать запрос аннулирования сессии.

В качестве альтернативы вы можете добавить токен в метод недействительности аутентификатора, который получает содержимое сеанса.

+0

привет марко. Я редактировал свой вопрос с помощью 'environment.js'. Возможно, проблема имеет какое-то отношение к [этому] (http://stackoverflow.com/questions/24716668/simple-auth-addon-seems-to-not-be-reading-env-config). Но я не мог попробовать, потому что не знаю, где я должен был точно положить этот фрагмент. – masciugo

+0

Вам больше не нужно 'window.ENV'. Является 'Ember.debug (" AUTHORIZING! ");' Фактически выполняется когда-либо (конечно, вам нужно было бы добавить заголовок в этом методе, конечно)? – marcoow

+0

Нет, это не выполнено. Я заметил от Ember Inspector, что фактический контейнер-авторизатор с именем custom существует, и среди его свойств «аутентификатор: аутентификатор: пользовательский», может быть, ошибочен. Посмотрите на прикрепленный скриншот ... – masciugo

Смежные вопросы