2014-11-06 2 views
4

getAuth()이 과거에 expires 인 객체를 반환 할 가능성이 있습니까?Firebase의 getAuth()가 만기가 지난 객체를 반환하는 이유

나는 expires 과거에있는 경우, getAuth()null가 반환 인상이었다. 하지만 내가 틀렸어. 여기

나는 내가 틀렸다 증명하는 방법입니다

var resolve = { 
    auth: function($q) { 
    var defer = $q.defer(); 
    var authData = rootRef.getAuth(); 

    if (authData === null) { 
     ... 
    } else { 
     var now = new Date()/1000; 
     console.log('Authenticated!'); 
     console.log('   Auth expiry: ' + authData.expires); 
     console.log('     Now: ' + now); 
     console.log('Is expiry in the past? ' + (authData.expires < now ? 'YES' : 'NO')); 
     defer.resolve(); 
    } 

    return defer.promise; 
    } 
}; 

여기 출력입니다 : 나는 위의 출력을받은 후 페이지를 새로 고치면

Authenticated! 
      Auth expiry: 1415276774 
        Now: 1415276804.45 
Is expiry in the past? YES 

, getAuth() 반환 null 예상대로 .

내가 문제를 재현하려면

  1. 닫고 응용 프로그램 (브라우저의 탭) 전에 로그인 세션 (I 1 개 세션 실험 만료를 이메일과 비밀번호
  2. 를 사용하여 로그인하지만, 같은 일이 발생을 다른 길이 세션)에 로그인 세션까지
  3. 기다립니다이 시점에서 실행 위의 코드를
  4. 를 열고 응용 프로그램을 (만료) 위의 출력을 생성

아이디어가 있으십니까?

+0

클라이언트 시계가 Firebase 서버와 동기화되지 않았을 수 있습니다. getAuth() 메서드를 반복하거나 onAuth() 콜백을 사용하면 결국 로그 아웃 이벤트가 표시됩니까? 이 테스트를 수행하는 동안 대시 보드의 로그인 및 인증 화면에서 세션 길이 설정을 변경합니까? - 클라이언트가 인증 할 때마다 예상 만료 시간을 캐시 할 수 있다고 생각합니다. –

+0

@Chris : 세션 길이가 동일하게 유지되며 문제를 재현 할 때 변경되지 않습니다. 'onAuth()'콜백을 추가했는데, 처음에는 ** 로그인 ** 이벤트 (과거에는 만기가 있음)와 ** 로그 아웃 ** 이벤트를 볼 수 있습니다. 나는 ** 로그인 ** 이벤트가 만료가 과거에 일어나지 않아야한다고 생각합니다. –

답변

2

Chris가 자신의 의견에서 언급했듯이 이는 클라이언트와 서버 시간의 차이로 인한 것으로 보입니다. 인증 페이로드에 지정된 시간 인 expires은 서버의 시간을 사용하여 서버에 의해 생성되지만, 이는 클라이언트의 시간과 적어도 약간 다를 수 있습니다. 기억해야 할 중요한 점은 서버가 지정한 TTL을 사용하여 클라이언트가 실제로 만료되었음을 의미합니다.

매 초마다 getAuth()을 호출하고 각 요청시 만료 시간과 현재 현지 시간의 차이를 기록하는 간단한 예제를 만들었습니다. 세션이 만료되면

한마디로
... 
session time remaining: 2.23s 
session time remaining: 1.23s 
session time remaining: 0.23s 
session time remaining: -0.76s 
session time remaining: -1.77s 
session expired 
session expired 
session expired 
... 

는, 클라이언트가 즉시 서버로 통보되지만, 클라이언트의 타임 스탬프가 몇 초 차이가 왜이다 : 다수의 반복을 통해 시험 할 때 다음과 같이 각각 보였다 getAuth()에서 반환 된 만료일은 과거로 보일 수 있습니다.

+0

'getAuth()'가 서버의 시간이 아닌 클라이언트의 시간에 의존하는 이유는 무엇입니까? 그것이 동기식이기 때문입니까? –

+0

비동기 메서드 ('onAuth()')를 사용하여 로그인 상태를 검사하려고했는데 문제가 발생하지 않습니다. 왜 동기식 방법으로 만 발생합니까? –

+0

@MishaMoroshko'getAuth()'메소드는 클라이언트의 시간에 의존하지 않습니다. 만료는 서버 *가 클라이언트에게 인증이 만료되었음을 알릴 때 발생합니다. 클라이언트는 만료 시간 타임 스탬프와 로컬 시간을 비교하지 않습니다. 이는 보안상의 허점을 남길 수 있기 때문입니다. 클라이언트의 시간이 크게 줄어들지 않는 한, 이것들은 몇 초 이상 동기화되지 않아야합니다. 비동기 메소드와 마찬가지로 발생하기 쉽지만 정확히 타이밍을 맞추기가 더 어려울 수 있습니다. –

관련 문제