2016-10-06 1 views
0

저는 crazy8와 같은 카드 게임을 만들고 있습니다. 그리고 저는 이미 프로토 타입을 발표합니다.사용자가 페이지를 다시로드 할 때 사용자를 어떻게 식별 할 수 있습니까?

여기 봐 http://himapoyo.com

내 문제가있다 내가 게임을하는 동안 페이지를 다시로드 할 때, 소켓 연결이 끊어 내 socket.id이 변경됩니다.

그래서 서버 측 프로그램에서 나를 식별 할 수 없습니다. 이제 서버는 소켓이 분리되었을 때 테이블에서 플레이어를 제거합니다. 서버가 서버를 식별 할 수없는 플레이어를 제거하지 않으면 게임이 중지되어 프로그램이됩니다. 하지만 사용자를 식별 할 수 있다면 테이블에서 페이지를 새로 고침 한 플레이어를 삭제하고 싶지는 않습니다.

질문 : 사용자가 페이지를 새로 고침 할 때 어떻게 사용자를 식별 할 수 있습니까?

쿠키를 사용하면 ID가이 문제에 가장 적합하다고 생각합니다. 다른 솔루션이 있습니까?

답변

0

다른 옵션은 다음과 같습니다

  • 는 사용자의 저장 새로 고침
  • 로 일부로서 사용자 ID를 게시하는 URL
  • 에 쿼리 문자열 값을 전달 클라이언트
  • 에 로컬 스토리지를 사용하여 서버 측 세션
  • redis 캐시에 사용자 정보 저장.

내가 한 번 사용자가 페이지를 새로 고침하는 나는 (내가 틀렸다면 정정 해줘) 이해 질문을 읽은 후 더 많은하지만 충분히

0

해야한다가 (자신의 소켓을 다시 연결)이 확신 해요 소켓 ID가 변경되고 (분명히) 사용자를 식별 할 수 없습니다.

우선, 사용자가 다시 연결할 때마다 소켓 ID가 변경되므로 소켓 ID를 사용하여 사용자를 추적해서는 안됩니다. 사용자를 식별 한 후에는 사용자와의 통신을 위해 소켓 ID를 추적해야합니다.

그래서, 나는 "인증"이벤트를 서버 측에서 만들고 "인증"이벤트를 내 보내지 않는 소켓의 연결을 끊습니다. 이 이벤트는 모든 형태의 자격 증명 (JWT, 사용자 이름 : 암호 등)을 기대할 수 있습니다.

사용자가 인증 된 후 해당 소켓 ID를 가져 와서이를 사용자 ID에 매핑하고 추가 통신을 위해 소켓 ID를 사용할 수 있습니다.

그래서 서버 측 흐름은 다음과 같이 될 것입니다 :

io.on("connect", function (socket) { 
    socket.on("authenticate", function(data) { 
     // do auth and then make other events 

     // if auth 

     socket.auth = true; 
     socket.emit("message", "User authenticated"); 
    }); 

    // If socket fails to authenticate within 3 seconds after connect, disconnect it 

    setTimeout(function() { 
     if (!socket.auth) { 
      socket.disconnect(); 
     } 
    }, 3000); 
}); 

앱으로 이동 후, 나는 필요하지 인증이없는 것으로 나타났다. 이름을 보내는 것만으로 테이블의 사용자 슬롯을 하이 잭 (highjack) 할 수 있으므로이 경우가 아닙니다.

괜찮 으면 사용자 이름을 추적하고 연결할 때 소켓 ID에 매핑 할 수 있습니다.

관련 문제