2017-02-20 3 views
0

Я использую Ember: 2.11.0, уголек-простую-авторизацию: 1.2.0Ember-простая аутентификация предотвращение сеанса недействительности на 401 réponse

Я использую уголек-простого-авторизацию для проверки подлинности моего приложения с помощью oauth2 в мой REST API.

Стандартное поведение ember-simple-auth - аннулировать сеанс пользователей, если сервер отвечает кодом состояния 401. Я хочу, чтобы справиться с этим разным и попытаться переопределить:

import DS from 'ember-data'; 
import DataAdapterMixin from 'ember-simple-auth/mixins/data-adapter-mixin'; 

export default DS.RESTAdapter.extend(DataAdapterMixin, { 
    host: 'http://localhost:3000', 
    authorizer: 'authorizer:oauth2', 

    /* 
    * The DataAdapterMixin invalidetes the session automatically if the server 
    * returns the status 401. We don't want this behaviour, so we override 
    * the handleResponse method. 
    */ 
    handleResponse(status) { 
    console.log(status); 
    return this._super(...arguments); 
    } 

}); 

В моей RestAdapter Пользуется DataAdapterMixin который вызывает недействительность в рамках метода handleResponse. Итак, я попытался переопределить этот метод в своем адаптере. Мой метод вызывается, но после того, как мой метод закончил, метод Примеси вызываются угольком, как вы можете увидеть здесь:

enter image description here

В Комментариях для состояния метода Ember superWrapper, что это сделано для обработки вызовов в методы суперкласса и перенаправить их к нему, но каким-то образом он перенаправляет его на mixin.

Я понятия не имею, почему это происходит. Вероятно, это можно было бы исправить, отредактировав DataAdapterMixin напрямую, но подумайте, что это не будет хорошей идеей с точки зрения совместимости с будущими версиями ember-simple-auth.

Я был бы очень признателен, если бы кто-то мог указать мне вправо чтобы сделать переопределение работы.

+0

На самом деле с 'this._super (... arguments);' вы вызываете mixin 'handleRresponse' –

ответ

1

Когда вы удлиняете адаптер из mixin, this._super(...arguments); вызовет метод mixin (если он имеет такой метод). Вот почему ваше переопределение не работает. У вас есть следующие варианты:

  1. Посмотрите в источник уголек-данных и скопировать код из handleResponseDS.RESTAdapter (start from here). No this._super call - нет влияния от mixin. Это может быть не так просто, как кажется, и может быть несовместимо с будущими версиями данных ember.
  2. Создайте свой собственный DataAdapterMixin, скопировав код с ember-simple-auth и удалив/изменив его метод handleResponse. Это может быть несовместимо с будущими версиями ember-simpe-auth.
  3. Изменить arguments перед вызовом this._super(...arguments), поэтому статус будет 400 вместо 401:

    handleResponse: function (status) { 
        /** 
        * Modify status 
        */ 
        if (status === 401) { 
        status = 400; 
        } 
    
        /** 
        * Replace status in arguments. 
        */ 
        var args = Array.prototype.slice.call(arguments, 0); 
        args.splice(0, 1, status); 
    
        /** 
        * Call parent's method 
        */ 
        return this._super(...args); 
    } 
    

    Этот метод совместим с будущими версиями - даже если новый аргумент будет добавлен (в данный момент аргументы status, headers , payload), этот код будет работать. Он перестанет работать, если статус больше не будет первым аргументом (я не думаю, что это произойдет в ближайшем будущем).

Но я хочу также сказать, что что-то, вероятно, не так с вашим бэкэндом: 401 означает «Неразрешенный» и уголек-простой аутентификация делает то, что должно быть сделано в данном случае - аннулирует сессию. Если вам нужен специальный статус для некоторых случаев, я бы предложил использовать 418 (я чайник).

+0

Спасибо за вашу помощь. Вы правы, я изменю код сервера.Я запутался в различии между HTTP 401 и 403. Я хотел справиться с ситуацией, когда пользователь аутентифицирован, но не разрешен для просмотра ресурса. 403 Кажется, лучше подходит. –

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