Я обновляю мой существующий код сделано в Ember-простой-AUTH: 0.8.0 для Ember-простой-авторизации: 1.0.1Ember простой аутентификации 1.0.1 пользовательские аутентификатор
Есть две проблемы
- Не выполняется сеанс
- REST Вызовы, требуемые для наличия сCredentials: true, не знаю, где я могу их установить.
Вот мой код
//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,
});
Dashboard
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 отказался, чтобы он не был разрешен заголовками.
Спасибо
а) я использовал адаптер данных подмешать. b) Я не уверен, что мой код вызывает блок несколько раз. c) у моего приложения сейчас есть 44 маршрута, и у него будет 2k + маршрута. почему я должен вводить сеанс в любом месте, пока я был в состоянии сделать это раньше, не добавляя их –
'block ('X-CSRF-Token', sessionData.token); block ('Content-Type', 'application/json; charset = utf-8 '); block (' withCredentials ', true); '. Если вы не хотите вводить услугу в каждый маршрут, вы также можете настроить автоматическую инъекцию через контейнер в инициализаторе. – marcoow
Хм, я следовал тому, что вы предложили, теперь есть только один вызов блока. Я могу отправить запрос ajax с использованием типа контента и с учетными данными. Есть 2 вещи.1) когда выполняется ajax-вызов, он не передает учетные данные. 2) когда я перезаряжаю, я вышел из системы. означает, что сеанс не сохраняется. –