2013-10-23 3 views
7

이 자습서는 빨간색으로 표시되었습니다 (http://howtonode.org/socket-io-auth). express와 socket.io를 사용하여 사용자를 인증하는 방법을 보여줍니다. Express가 없어도 socket.io만을 사용하여 사용자를 인증하는 방법이 있습니까?socket.io를 사용하는 사용자 인증

편집 : 세션으로 취급

나는 RedisStore (https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO)를 사용합니다. 왼쪽은 인증 쿠키를 만드는 모듈입니다. 누군가 세션 처리로 할 수있는 것처럼 인증 쿠키를 생성하는 데 사용할 수있는 socket.io 구현을 알고 있습니까?

+0

Socket.IO를 독립 실행 형으로 사용하고 있습니까?인증자는 쿠키를 생성하지 않고 Socket.IO에 전달합니다. – hexacyanide

+0

@hexacyanide 내가 socket.io와 함께 express를 사용하고있는 순간. Express는 인증 쿠키 만 작성합니다. 나는 라우팅, 미들웨어, ....를 사용하지 않는다. express와 socket.io 사이의 세션은 connect-redis와 공유된다. 쿠키를 쓰는 데에만 익스프레스를 사용하는 것은 너무 큰 의존성이라고 생각합니다. 그래서 익스프레스 (연결)에 의존하지 않는 솔루션을 찾고 있습니다. 내 자신의 테스트 및 안전하지 않은 인증 절차를 구현할 수 있지만 Golo Roden이 권장하지는 않는다고 제안했습니다. – bekite

+0

즉, 기본 HTTP 서버에서 실행되는 구현을 원하십니까? HTTP 서버를 완전히 사용하지 않으려면 쿠키를 사용하고 싶습니까? – hexacyanide

답변

9

나는 약간 오래된 것으로 알고 있지만 미래의 독자는 쿠키를 구문 분석하고 저장소 (예 : passport.socketio)에서 세션을 검색하는 접근법에 토큰 기반 접근법을 고려할 수도 있습니다.

이 예제에서는 꽤 표준 인 JSON 웹 토큰을 사용합니다.

var socketioJwt = require('socketio-jwt'); 

var sio = socketIo.listen(server); 

sio.set('authorization', socketioJwt.authorize({ 
    secret: jwtSecret, 
    handshake: true 
})); 

sio.sockets 
    .on('connection', function (socket) { 
    console.log(socket.handshake.decoded_token.email, 'has joined'); 
    //socket.on('event'); 
    }); 

을 다음과 같이

이제
var jwt = require('jsonwebtoken'); 
// other requires 

app.post('/login', function (req, res) { 

    // TODO: validate the actual user user 
    var profile = { 
    first_name: 'John', 
    last_name: 'Doe', 
    email: '[email protected]', 
    id: 123 
    }; 

    // we are sending the profile in the token 
    var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 }); 

    res.json({token: token}); 
}); 

, 당신의 socket.io 서버를 구성 할 수 있습니다 :이 예에서는 JWT가 반환하는 인증 엔드 포인트를 상상 클라이언트 페이지로 토큰을 제공해야

var socket = io.connect('', { 
    query: 'token=' + token 
}); 

나는이 메타에 대한 자세한 설명을 썼다 socket.io-JWT 미들웨어 만 첨부해야하는 클라이언트 있도록 연결할 때, 쿼리 문자열에서 토큰을 기대 쿠키 및 쿠키 here.

+1

이렇게하려면 토큰이 세션처럼 사용되지 않습니까? 에서처럼, 토큰은 클라이언트를 제외하고는 아무 데나 저장되지 않습니까? 세션 저장소에서 토큰을 세션 ID로 사용하는 것과 동일한 보안을 사용하여 토큰을 디코딩합니까? 나는이 토큰 기반 메소드의 이점에 대해 머리를 쓰려고한다. – funseiki

+0

@ José F. Romaniello 쿠키 기반 인증을 요청했지만 답변을 수락합니다. 2013 년에 나는 쿠키가가는 길이라고 생각했습니다. 기사 (그리고 auth0의 다른 글)를 읽은 후 토큰을 시험해 볼 것입니다. – bekite

3

인증 또는 세션 처리 코드를 수동으로 연결하는 대신 session.socket.io과 같은 전용 모듈을 사용하는 것이 좋습니다 (단,이 모듈은 Express가 필요한 모듈입니다).

일종의 세션 처리가 필요하기 때문에 downvotes가 있다고 추측합니다 (그러나 알지 못합니다). 아마도 수동으로 처리하기를 원하지 않을 것입니다. 따라서 여기에 Express를 사용하는 것이 좋습니다.

그럼에도 불구하고 Express가 없으면 어떻게 할 수 있는지에 대해서는 대답 할 수 없지만 흥미로운 질문입니다.

+0

RedisStore를 사용합니다. 그것을 https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO에서 찾았습니다. – bekite

1

저는 며칠 전에 node.js를 처음 사용하기 시작했습니다. 그리고 나는 익스프레스를 사용하지 않고 사용자 인증을하는 첫 번째 부분에 대해서만 대답 할 수 있습니다. 그리고 아직 세션 스타일 처리가 없습니다.
이 질문에 아직 답하고있는 이유는 노드를 처음 사용하는 다른 사람들을 돕기위한 것입니다.

나는 현재 내 학습 프로젝트 (socket.io 기반 채팅, 그 밖의 무엇입니까?)에서 인증을 위해 http 서버를 사용하고 있습니다.
http 서버에서 유효한 인증을 얻을 수없는 경우 socket.io 인터페이스가있는 페이지에 액세스 할 수 없습니다.

http 서버의 사용자 인증은 일부 POST 데이터를 읽음으로써 처리됩니다. POST 데이터가 유효한 사용자 데이터 인 경우에만 사용자는 socket.io 인터페이스가있는 채팅으로 이동할 수 있습니다.

관련 문제