Узлы, различающие http запросы; несколько устройств с одинаковым публичным IP - PullRequest
0 голосов
/ 14 января 2019

Нello! Я пытаюсь представить клиентские соединения через http с узлом. Прямо сейчас у меня что-то вроде:

let names = [ 'john', 'margaret', 'thompson', /* ... tons more ... */ ];
let nextNameInd = 0;   

let clientsIndexedByIp = {};
let createNewClient = ip => {
  return {
    ip,
    name: names[nextNameInd++],
    numRequests: 0
  };
};

require('http').createServer((req, res) => {

  let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

  // If this is a connection we've never seen before, create a client for it
  if (!clientsIndexedByIp.hasOwnProperty(ip)) {
    clientsIndexedByIp[ip] = createNewClient(ip);
  }

  let client = clientsIndexedByIp[ip];
  client.numRequests++;

  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify(client));

}).listen(80, '<my public ip>', 511);

Я запускаю этот код на каком-то удаленном сервере, и он работает нормально; Я могу запросить этот сервер и получить ожидаемый ответ. Но у меня есть проблема: мой ноутбук и мой смартфон подключены к одному и тому же Wi-Fi; если я запрашиваю этот сервер с моего ноутбука и смартфона, сервер считает, что оба устройства имеют один и тот же IP-адрес, и он создает только один «клиентский» объект для них обоих.

например. параметр «имя» ответа одинаков для каждого.

Проверка whatsmyip.org на моем ноутбуке и смартфоне показывает мне один и тот же IP-адрес - это меня удивило, так как мое понимание IP оказалось неверным. До этого момента я думал, что все устройства имеют уникальный IP-адрес.

Я хочу, чтобы разные устройства ассоциировались с разными клиентами, даже если два устройства находятся в одной и той же сети Wi-Fi. Я предполагаю, что данных, которые я использую для устранения неоднозначности устройств, одного IP-адреса их запроса (req.headers['x-forwarded-for'] || req.connection.remoteAddress) недостаточно.

Как различить несколько устройств, подключенных к одному и тому же маршрутизатору? Есть ли в объекте req дополнительный бит данных, который допускает это?

Или это просто неверная конфигурация сети, когда у моего ноутбука и смартфона один и тот же IP-адрес?

Спасибо!

1 Ответ

0 голосов
/ 14 января 2019

Если вы используете модуль экспресс-отпечатков пальцев, это будет работать в большинстве случаев, например:

const express = require('express');
const app = express();
const port = 3000;
var Fingerprint = require('express-fingerprint')

app.use(Fingerprint( { parameters:[
    Fingerprint.useragent,
    Fingerprint.geoip ]
}));

app.get('/test', function(req, res){
    console.log("Client fingerprint hash: ", req.fingerprint.hash);
    res.send("Your client Id: " + req.fingerprint.hash);
});

app.listen(port);

У каждого клиента будет уникальный хеш, который вы можете использовать для его идентификации. Следует понимать, что этот подход будет иметь ограничения, и назначение файла cookie клиенту будет работать лучше для некоторых случаев использования.

...