2017-02-20 7 views
0

401 reponse에 세션 무효화를 방지 내 REST API에 oauth2.엠버 - 간단한 인증 내가 엠버을 사용하고

ember-simple-auth의 표준 동작은 서버가 401 상태 코드로 응답하는 경우 사용자 세션을 무효화하는 것입니다. 나는이 서로 다른 처리하고이를 무시하려고 시도하는 내 RestAdapter에서

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); 
    } 

}); 

을 나는 handleResponse 메소드 내 무효화를 트리거 DataAdapterMixin를 사용합니다. 그래서 어댑터에서이 메서드를 재정의하려고했습니다. 내 방법이라고하지만 내 방법을 완료 한 후 여기에서 볼 수 있듯이, 유지 mixin 방법은, 엠버 의해 호출되는 다음 엠버 superWrapper 방법 상태에 대한

enter image description here

댓글 '이 호출을 처리하기 위해 만든 것으로, 슈퍼 클래스의 메소드를 리다이렉트하지만, 어떻게 든 그것을 믹스 인으로 리다이렉트하는 것처럼 보입니다.

왜 이런 일이 발생하는지 잘 모릅니다. 이 문제는 DataAdapterMixin을 직접 편집하여 해결할 수 있지만 이후 버전의 ember-simple-auth와의 호환성 측면에서 좋지 않을 것이라고 생각합니다.

누군가가 나를 올바르게 지적 할 수 있다면 정말 고맙겠습니다. 방향을 지정하여 오버라이드 작업을 수행합니다.

+0

사실'this._super (... arguments);와 함께 mixin'handleRresponse'를 호출합니다 –

답변

1

mixin에서 어댑터를 확장하면 this._super(...arguments);은 mixin의 메소드를 호출합니다 (해당 메소드가있는 경우). 이것이 오버라이드가 작동하지 않는 이유입니다. 엠버 - 데이터 소스에

  1. 봐와 DS.RESTAdapter (start from here)에서 handleResponse 코드를 복사 : 당신은 다음과 같은 옵션이 있습니다. No this._super 전화 - mixin의 영향 없음. 이것은 소리가 나지 않고 다음 버전의 ember 데이터와 호환되지 않을 수 있습니다.
  2. 코드를 ember-simple-auth에서 복사하고 handleResponse 메서드를 제거/수정하여 직접 만듭니다. 이것은 ember-simpe-auth의 향후 버전과 호환되지 않을 수 있습니다.
  3. 상태가 400 대신 401 수 있도록, this._super(...arguments)를 호출하기 전에
  4. 수정 arguments :

    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)는 "unathorized"와 엠버 - 간단한 인증이 무엇인지,이 경우 수행해야합니까 의미 - 세션을 무효화합니다. 어떤 경우에 특별한 지위가 필요하면 418 (나는 찻 주전자)을 사용하도록 제안합니다.

+0

도움 주셔서 감사합니다. 네 말이 맞아, 내 서버 코드를 바꿀거야.HTTP 401과 403 사이의 차이점과 혼동스러워졌습니다. 사용자가 인증되었지만 ressource를 볼 수없는 상황을 처리하고 싶었습니다. 403 잘 맞는 것 같습니다. –