2017-01-26 4 views
0

CSRF 보호 기능이있는 HTTP 기본 로그인에 ember-simple-auth 및 사용자 지정 인증자를 사용하고 있습니다. 세션이 만료 될 때와 같이 실패 할 때 복원 방법이 해결되는 경우를 제외하고는 모든 것이 잘 작동합니다.사용자 지정 인증 자의 복원 방법 고정

인증에 성공하면 csrf 토큰으로 해결하지만 토큰 또는 세션이 만료되고 페이지를 새로 고치면 여전히 토큰이 있는지 확인하기 때문에 해결 방법이 계속됩니다 (if 그것은 유효하다). 나는 이것이 틀렸다는 것을 안다. 그래서 나는 나의 질문이 이것을 처리 할 수있는 적절한 방법이 될 것이라고 생각한다. 세션 ID로도 해결해야합니까? 저장된 토큰을 가진 복원 메소드에서 AJAX 요청을 전송하여 여전히 유효한지를 확인하고 성공을 리턴해야합니까? 나는 내가 할 수있는 다른 개선 사항에 대해서도 관심이있다.

import Ember from 'ember'; 
import ENV from 'criteria-manager/config/environment'; 
import Base from 'ember-simple-auth/authenticators/base'; 

export default Base.extend({ 

    restore(data) { 
     return new Ember.RSVP.Promise((resolve, reject) => { 
      if (data.token) { 
       Ember.$.ajaxSetup({ 
        headers: { 
         'X-XSRF-TOKEN': data.token 
        } 
       }); 
       resolve(data); 
      } 
      else { 
       reject(); 
      } 
     }); 
    }, 
    authenticate(credentials) { 
     let csrfToken = this.getCookie('XSRF-TOKEN'); 
     return new Ember.RSVP.Promise((resolve, reject) => { 
      Ember.$.ajax({ 
       beforeSend: function(xhr) { 
        xhr.setRequestHeader("Authorization", "Basic " + btoa(credentials.username + ":" + credentials.password)); 
        xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken); 
       }, 
       url: ENV.host + "/api/users/login", 
       method: 'POST' 
      }).done(() => { 
       //A new CSRF token is issued after login, add it to future AJAX requests 
       Ember.$.ajaxSetup({ 
        headers: { 
         'X-XSRF-TOKEN': this.getCookie('XSRF-TOKEN') 
        } 
       }); 
       Ember.run(() => { 
        resolve({ 
         token: this.getCookie('XSRF-TOKEN') 
        }); 
       }); 
      }).fail((xhr) => { 
       Ember.run(() => { 
        if(xhr.status === 0) { 
         reject("Please check your internet connection!"); 
        } 
        else if (xhr.status === 401) { 
         reject("Invalid username and/or password."); 
        } 
        else { 
         reject("Error: Http Status Code " + xhr.status); 
        } 
       }); 
      }); 
     }); 
    }, 
    invalidate() { 
     return new Ember.RSVP.Promise((resolve, reject) => { 
      let csrfToken = this.getCookie('XSRF-TOKEN'); 
      Ember.$.ajax({ 
       beforeSend: function(xhr) { 
        xhr.setRequestHeader("X-XSRF-TOKEN", csrfToken); 
       }, 
       url: ENV.host + '/logout', 
       method: 'POST' 
      }).done(() => { 
       Ember.run(() => { 
        resolve(); 
       }); 
      }).fail(() => { 
       Ember.run(() => { 
        reject(); 
       }); 
      }); 
     }); 
    }, 
    getCookie(name) { 
     let alLCookies = "; " + document.cookie; 
     let cookieArray = alLCookies.split("; " + name + "="); 
     if (cookieArray.length === 2) { 
      return cookieArray.pop().split(";").shift(); 
     } 
    } 
}); 

답변

0

가 나는 또한 세션 ID로 해결해야합니다 여기

내 인증 코드? AJAX 요청을 저장된 토큰을 사용하는 복원 방법으로 보내야 이 유효한지 확인하고 성공 여부를 확인해야합니까?

모두 프로젝트의 필요에 따라 다릅니다. 내 의견으로는 토큰이 유효한지 확인하는 것이 좋습니다. 예를 들어, oauth2-password-grant은 만료 날짜를 세션에 저장하고 복원 할 때 단순히 현재 시간과 비교합니다. 당신도 이것을 할 수 있습니다. 또는 백엔드에 토큰 유효성 검사 끝 점이 있으면 토큰이 유효한지 확인하라는 요청을 보낼 수 있습니다.