2013-02-11 34 views

Trả lời

17

Got này từ in ấn các phím trong đối tượng socket:

> ws._socket.address() 
    { port: 8081, 
    family: 2, 
    address: '127.0.0.1' } 

> ws._socket.remoteAddress 
    '74.125.224.194' 

> ws._socket.remotePort 
    41435 

tôi không có bất kỳ tài liệu vì vậy tôi không chắc chắn như thế nào này được hỗ trợ trên các phiên bản:/

34

Sau một chút phiền xung quanh cố gắng tìm ra cái nào cung cấp cho địa chỉ IP của client (trình duyệt web của), câu trả lời là:

ws._socket.remoteAddress 

Hoặc nếu bạn có quyền truy cập vào req qua wss.on('connection', (ws, req) => {}):

req.connection.remoteAddress; 

Bạn có thể sử dụng điều này, ví dụ, để GeoIP xác định vị trí người dùng đang kết nối.

Edit:

Nếu bạn đang chạy Node đằng sau một reverse proxy Nginx (hoặc bất kỳ reverse proxy khác cho rằng vấn đề), bạn có thể cần phải sử dụng:

req.headers['x-forwarded-for'] || req.connection.remoteAddress 

Một lưu ý về bảo mật: Nếu máy chủ Node của bạn có sẵn trực tiếp cũng như thông qua proxy ngược lại, bạn có thể muốn kiểm tra remoteAddress trước khi tin tưởng x-forwarded-for. Địa chỉ từ xa phải là IP của proxy ngược của bạn. Có một cơ hội kỳ quặc mà ai đó có thể gọi trực tiếp đến dịch vụ của bạn và giả mạo x-forwarded-for.

+0

Chỉ cần được pedantic - chỉnh sửa áp dụng cho tất cả các proxy, không chỉ nginx đảo ngược (rất nhiều người sử dụng haproxy) – UpTheCreek

+0

Hmmm đó là kỳ quặc, khi hiển thị socket.upgradeReq.connection trong giao diện điều khiển, các remoteAddress trường bị ẩn, bất kỳ ý tưởng tại sao? Nó đã cho tôi mãi mãi để tìm IP người dùng. Cảm ơn bạn Chris Nolet! :) –

+0

Thật đáng ngạc nhiên khi tất cả các API web socket này khác nhau rất nhiều. Rất nhiều tiềm năng, nhưng vẫn bị phân mảnh. –

Các vấn đề liên quan