Проверка подлинности Laravel - socket - храповика - api

86
5

Я разрабатываю API RAR Laravel для приложения iOS (его разрабатывает другой парень). Это означает, что веб-часть вообще не используется, приложение связывается через запросы CURL с API. Хотя файлы cookie используются.

Теперь мне нужно проверить статус онлайн/оффлайн-пользователя, где идет сокет. И я не могу понять, как я могу аутентифицировать пользователя при подключении сокета.

Во всех примерах мне удалось найти JS-скрипт для проверки подлинности в Laravel через сеансы PHP и файлы cookie.

Поэтому в моем сценарии для REST API приложение iOS получает ACCESS_TOKEN, которое позже я могу использовать в сокетах.

Запрос CURL запрашивает логин и пароль POST и получает токен доступа в формате JSON и обновляет токен в cookie.

curl -kX POST https://site/login -b cookies.txt -c cookies.txt -D headers.txt -H 'Content-Type:application/json' -d '
{
"username":"gruzua",
"password":"qwerty09876",
}'

отклик

Часть JSON

{
"access_token":"ACCESS_TOKEN",
"expires_in":600,
}

Часть файлов cookie (на всякий случай):

HTTP/1.1 200 OK
Server: nginx/1.10.3
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache, private
Date: Wed, 17 May 2017 17:08:09 GMT
Set-Cookie: refreshToken=SOME_REFRESH_TOKEN; expires=Mon, 07-Jan-2019 17:08:09 GMT; Max-Age=51840000; path=/; HttpOnly

По каждому запросу секвенции CURL отправляет токен ACCESS_TOKEN для аутентификации

curl -kX GET https://site/user -H 'Authorization: Bearer ACCESS_TOKEN'

На данный момент у меня есть токен доступа и вы хотите открыть соединение сокета.

Согласно http://socketo.me/docs/hello-world, я могу открыть telnet-соединение и записать там некоторые форматированные данные JSON, содержащие мой ACCESS_TOKEN. На стороне сервера в реализации компонента Ratchet ComponentInterface onOpen мне нужно проверить авторизацию пользователя. Может быть, это невозможно вOpen, тогда опции есть onMessage? Тем не мение

Мой вопрос заключается в том, как использовать аутентификацию laravel здесь?

namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat implements MessageComponentInterface {
protected $clients;

public function __construct() {
$this->clients = new \SplObjectStorage;
}

public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later

/*
Here I have to get somehow the user ACCESS_TOKEN
and to check authorization the way it checked
when using CURL passes ACCESS_TOKEN in header
Something like this
$user = Auth::user();
if (!emtpy($user))
{
// Check e.g. user permissions (authorization) and allow connection if it ok
}
else
{
// Reject connection
}
*/
$this->clients->attach($conn);

echo "New connection! ({$conn->resourceId})\n";
}
...

Насколько я понимаю, клиент может передать строку JSON в соединение сокета. Сервер я могу запросить базу данных laurvel oauth_access_tokens для ACCESS_TOKEN и получить мою модель пользователя и загрузить соответствующие пользовательские данные. Но я думаю, что это не правильный путь, так как я хочу использовать всю мощь защиты/промежуточного ПО Laravel и других вещей, которые мне не нравятся, но я чувствую, что это очень необходимо. Поэтому я хочу проверить подлинность не руками, а позволить ларавелю выполнять эту работу.

Я знаю об этом разделе Laravel Ratchet socket Auth, но он говорит о сеансе и запрашивает файлы cookie, что невозможно в моем случае.

спросил(а) 2021-01-19T16:19:56+03:00 2 месяца, 3 недели назад
1
Решение
114

Итак, вот как выглядит мое решение.

Мне нужен такой подход для авторизации в подключении сокетов без браузера (Ratchet), где JS-код не запущен. Поэтому я не мог использовать Ratchet WebSocket, только простой сокет Ratchet IoServer.

Мой контроллер API возвращает JSON, поэтому он легко работает с ответом.

Мне нужен этот подход в основном для аутентификации соединения сокета, предполагающего, что клиент знает токен доступа, когда один открывает сокет (полученный REST при входе в систему).

Пользователь подключается по telnet и отправляет строку JSON, содержащую токен. Увы, я не справился

telnet 192.168.0.100 8080

{"token":"ACCESS_TOKEN"}

Класс ratchet server выглядит так, как описано здесь. Вызовите контроллер Laravel из кода и передайте ему HTTP-заголовки

Таким образом, согласно моему ответу API-контроллера (ложному или текущему пользователю, если он был протестирован), я могу решить, аутентифицируется ли значение $ conn.

Вот еще один более узкий вопрос, помогающий ответить на этот вопрос: вызовите Laravel-контроллер из кода и передайте ему HTTP-заголовки

ответил(а) 2021-01-19T16:19:56+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема