Как проверить, подключен ли пользователь и получить его идентификатор сеанса (сеанс запущен PHP)

** Я видел несколько сообщений по этому вопросу или в стиле этого вопроса, но они были заданы довольно давно, и я хотел получить обновленный ответ, который может помочь и другим

Я работал над простым веб-сайтом (для обучения) с использованием PHP, с системой регистрации и входа в систему. Теперь есть страницы, доступные только авторизованным пользователям. В PHP я просто запускаю сеанс, давая пользователям их уникальный session_id всякий раз, когда они входят в систему, и если страница предназначена для просмотра только зарегистрированными пользователями, я просто проверяю, установлен ли сеанс, а также получаю содержимое сеанса , который будет использоваться для получения данных о пользователе из базы данных (имя, день рождения и т. д.)

Теперь я хочу добавить возможность чата в реальном времени, используя socket.io с Node.js. Поэтому мне нужно разрешить доступ только зарегистрированным пользователям и получить их идентификатор сеанса, чтобы я мог получить их имя из базы данных для отображения. На данный момент это основной рабочий чат, который работает для всех, кто попадает на localhost:3000: (содержит 2 файла: index.html и index.js)

Редактировать:

это то, что я использую в PHP для входа пользователей:

session_start();
$_SESSION['username'] = $username;

И проверьте, вошли ли они в систему:

if (!isset($_SESSION['username'])) { //do stuff

И я хочу, чтобы содержимое чата сохранялось (например, чаты Facebook или WhatsApp), поэтому мне нужно, чтобы сеанс был доступен для nodeJS для вставки содержимого чата в базу данных, а также для получения предыдущего контента из базы данных, не так ли? Или я могу это сделать только через PHP?

---- Конец редактирования ----

index.js:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.info('a user connected');
    socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    });
  socket.on('disconnect', function(){
    console.info('user disconnected');   
  });
});

http.listen(3000, function(){
  console.info('listening on *:3000');
});

index.html:

<!doctype html>
<html>
  <head>    
    <script src = "socket.io/socket.io.js"></script>
    <script
        src = "https://code.jquery.com/jquery-3.3.1.min.js"
        integrity = "sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8 = "
        crossorigin = "anonymous"></script>
    <script>
    $(function () {
        var socket = io();
        $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
    });
  });
</script>
    
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
    
  </head>
  <body>

    <ul id = "messages"></ul>
    <form action = "">
      <input id = "m" autocomplete = "off" /><button>Send</button>
    </form>
  </body>
</html>

Что мне нужно сделать?

Спасибо

Что означает «зарегистрированные пользователи»? Почему бы вам не проверить это условие и не обернуть вызовы для инициализации чата в этом условии?

Nico Haase 02.05.2018 16:48

это означает, что сеанс начался с их уникального сеанса, взятого из базы данных, когда они предоставляют свое имя пользователя и пароль: session_start (); $ _SESSION ['username'] = $ username; Но я хочу, чтобы чат был сохранен, поэтому мне нужны данные сеанса в коде JS, чтобы добавить сообщения в базу данных MySQL, не так ли?

user9644796 02.05.2018 16:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
548
1

Ответы 1

Вы можете отправить имя пользователя с сообщением чата. Так, например, ваше сообщение чата содержит «Hello world», и пользователь «John Doe» его отправил. Тогда вы могли бы отправить такой объект, а не только сообщение:

{ "name": "John Doe", "message": "Hello World" }

в ваше приложение чата.

С другой стороны, вы декодируете этот объект JSON и просто отображаете имя и сообщение.

В вашем случае это будет означать замену следующего:

socket.emit('chat message', $('#m').val());

с участием

socket.emit('chat message', {name: "John Doe", message: $('#m').val()});

А также

$('#messages').append($('<li>').text(msg));

С участием

$('#messages').append($('<li>').text(msg.name + ": " + msg.message));

Спасибо, кстати, я отредактировал сообщение (под ** edit). Редактировать о том, как разрешить чат только авторизованным пользователям. Означает ли это, что я могу просто оставить PHP-условие «if (! Isset ($ _ SESSION ['username']))» над файлом чата (index.html)?

user9644796 02.05.2018 16:55

Это сработает, хотя это не совсем безопасно. Любой, кто знает о вашем сервере NodeJS, по-прежнему может отправлять и получать сообщения из вашего чата. Что касается вашего редактирования: вы можете сохранять сообщения в Javascript, так что вам не нужен PHP. LocalStorage кажется подходящим API для этого: developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

Teun 02.05.2018 16:58

Я понимаю, каков был бы ваш подход, чтобы проверить, что пользователь вошел в систему через узел? так что даже тот, кто знает о сервере, не сможет общаться в чате, если он не является этим конкретным пользователем? Мне как-то нужно будет передать сеанс index.js для проверки, верно? Или есть другой подход

user9644796 02.05.2018 17:00

Это еще более сложно, вам понадобится какой-то токен на стороне клиента (Javascript), с которым вы можете связать пользователя. Это может быть немного сложно по сравнению с тем, что вы сделали. Это также то, что вы не можете просто объяснить в подобной редакции, этот поток, кажется, объясняет это: stackoverflow.com/questions/29121112/…

Teun 02.05.2018 17:03

Поэтому, если я хотел добавить аутентификацию на основе токенов (к текущему веб-сайту на основе PHP), это означает, что новый токен будет создаваться каждый раз, когда пользователь переходит на страницу «только для входа в систему» ​​(просто пример)

user9644796 02.05.2018 17:06

@pileup не обязательно, загляните в jwt

JimL 02.05.2018 17:11

Я сразу посмотрю, но у меня есть несколько вопросов: (1) Заменит ли JWT текущую систему входа на основе сеанса? (2) Насколько сложно будет добавить систему JWT новичку? (3) Поможет ли JWT мне проверить, вошел ли пользователь в систему в файле nodeJS?

user9644796 02.05.2018 17:15

(1) Может, но в этом нет необходимости (2) JWT как концепция не сложна, труднее заставить реализацию работать. (3) JWT может помочь вам проверить, вошел ли пользователь в систему

Teun 03.05.2018 10:02

Другие вопросы по теме