Как получить доступ к Laravel Auth в RatchetPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как получить доступ к Laravel Auth в Ratchet

Сообщение Anonymous »

Я нашел на Laravel.io сообщение о том, как загружать сеансы Laravel в Ratchet, который устарел и использует Laravel 5.4, поэтому я изменил несколько вещей, чтобы это работало с Laravel 8.x

Код: Выделить всё

public function onOpen(ConnectionInterface $conn)
{
// Attach connection
$this->clients->attach($conn);

// Create a new session handler for this client
$session = (new SessionManager(App::getInstance()))->driver();

// Get the cookies
$cookiesRaw = $conn->httpRequest->getHeader('Cookie');
$cookies = [];

if(count($cookiesRaw)) {
$cookies = Header::parse($cookiesRaw)[0]; // Array of cookies
}

// Get the laravel's one - todo: try catch
$sessionId = Crypt::decrypt(urldecode($cookies[Config::get('session.cookie')]), false);

var_dump($sessionId);

// Set the session id to the session handler
$session->setId($sessionId);

// Bind the session handler to the client connection
$conn->session = $session;

var_dump($conn->session->getId());
}
Затем я также изменил сообщение об отправке, поскольку получаю неожиданные результаты.

Код: Выделить всё

public function onMessage(ConnectionInterface $conn, MessageInterface $msg)
{
$conn->session->start();
$sessionId = $conn->session->getId();

var_dump($sessionId);

if(!is_null(($decoded = json_decode(base64_decode($msg), true))) && array_diff(['message'], array_keys($decoded)))
return;

var_dump($decoded['message']);

return;
}
Я тестирую это с помощью интерфейса JS следующим образом:

Код: Выделить всё

class WebRTC
{
socket;
constants;
timerId;

constructor(protocol, fqdns, port) {
this.constants = {
protocol: protocol,
fqdns: fqdns,
port: port
};

this.listenChanges();
}

listenChanges() {
this.socket = new WebSocket(`${this.constants.protocol}://${this.constants.fqdns}:${this.constants.port}`);

this.socket.onmessage = e => {
console.log(atob(e.data));
};

this.socket.onerror = () => {
this.socket.close();
};

this.socket.onopen = () => {
console.info('Connected to WebRTC Chat Server...');

this.socket.send(btoa(JSON.stringify({
message: '{{ session()->getId() }}' // Expected session
})));

clearInterval(this.timerId);

this.socket.onclose = () => {
this.timerId = setInterval(() => {
this.listenChanges();
}, 1000);
};
};
}
}

new WebRTC('ws', '127.0.0.1', '8080');
& Когда соединение открывается, я отправил session()->getId(), который является ожидаемым сеансом, который мне нужен. Однако мой вывод в CLI:
onOpen() : $sessionId

Код: Выделить всё

string(81) "b0e41cf0d856bdfc8427e1fdde62d5a154519f9c|MLXa9H2BbnQmySt2hRB360UANxLGHyz6iRMxGcoG"
onOpen() : $conn->session->getId()

Код: Выделить всё

string(40) "qyaDOQjNFlbrbjvvKRE1m5sN0dsGqqAsoMfkeqyU"
onMessage(): $conn->session->getId()

Код: Выделить всё

string(40) "qyaDOQjNFlbrbjvvKRE1m5sN0dsGqqAsoMfkeqyU"
Фактический сеанс в формате JS Blade, который отправляется в виде сообщения

Код: Выделить всё

string(40) "MLXa9H2BbnQmySt2hRB360UANxLGHyz6iRMxGcoG"
Здесь мой ожидаемый метод onMessage() получает введенную зависимость $conn (ConnectionInterface) с ->session->getId() фактического сеанса()->getId(), чтобы я мог заставить Auth::user() работать.
Есть идеи о том, что я делаю неправильно? Я попробовал var_dump($conn->session->get(Auth::getName()));, как говорит Laravel.Io, но он возвращает значение null в var_dump, и мой пользователь вошел в систему.
Это должно дать мне доступ к использованию User::find() или Auth::user().

Подробнее здесь: https://stackoverflow.com/questions/666 ... in-ratchet
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»