Laravel Echo с NodeJS HTTPS не работает

Я разрабатываю это приложение NodeJS, которое использует функциональные возможности Laravel Echo для получения информации с сервера через соединение через сокет.

На стороне сервера Laravel Echo Server с Laravel 5.7.19

Клиентская "laravel-echo": "^ 1.5.2" "socket.io": "^ 2.2.0"

import Echo from '../../node_modules/laravel-echo/dist/echo.common.js'
import Socketio from 'socket.io-client';

let echo = new Echo({ 

  broadcaster: 'socket.io',
  host: 'https://smartfish.danymota.com:8080/',
  encrypted: true,
  secure: true,
  client: Socketio,
  auth: {
    headers: {
      'Authorization': 'Bearer ' + this.token.bearerToken,
    },
  },
});
echo.private('central.' + macAddress)
  .listen('RulesUpdated', (response) => {
    handleRules(JSON.parse(response.aquarios))
    console.log(new Date().toLocaleString() + " - Rules updated")
  })

Проблема В Http все работает нормально, при переходе на HTTPS просто перестает работать. Кроме того, соединение сокета не достигает сервера (или, по крайней мере, Laravel-echo-server не регистрирует его)

ВАЖНО - то, что я пробовал

  1. Запустите приложение через Browserify, а затем в браузере (отлично работает в браузере, даже с HTTPS).

  2. Поигрался с разными портами (опять же, он работает с HTTP, поэтому порты, скорее всего, не проблема)

  3. Изменен URL-адрес на wss: //, /socket.io

  4. Вынуждает socket.io включать secure: true в опциях

  5. Изменена версия Laravel Echo

  6. Пытался импортировать как echo.common.js, так и echo.js

Примечания

/ api / broadcasting / auth - это работает, поэтому проблема, скорее всего, не здесь

Конфигурация эхо-сервера Laravel

    {
    "authHost": "https://smartfish.danymota.com",
    "authEndpoint": "/api/broadcasting/auth",
    "clients": [{
        "appId": "f7506b5e7118092c",
        "key": "9015d93999f3a2f7f95a054a76fbcbfd"
    }],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath1": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "8080",
    "protocol": "https",
    "socketio": {},
    "sslCertPath": "/home/danymota/ssl/cert/smartfish.danymota.com.crt",
    "sslKeyPath": "/home/danymota/ssl/private/smartfish.danymota.com.key",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "http://smartfishweb.test/api",
        "allowMethods": "GET, POST",
        "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
    }
}

Отладка Socket.io

socket.io-client:url parse https://smartfish.danymota.com:8080/socket.io +0ms
socket.io-client new io instance for https://smartfish.danymota.com:8080/socket.io +0ms
socket.io-client:manager readyState closed +0ms
socket.io-client:manager opening https://smartfish.danymota.com:8080/socket.io +0ms
socket.io-client:manager connect attempt will timeout after 20000 +4ms
socket.io-client:manager readyState opening +1ms
socket.io-client:manager connect_error +60ms
socket.io-client:manager cleanup +0ms

Спасибо всем заранее.


person João Marques    schedule 08.01.2019    source источник


Ответы (2)


это потому, что вам нужно установить настройки эхо-сервера laravel

используйте эту команду laravel-echo-server init и выберите https при настройке протокола

или откройте laravel-echo-server.json

и измените протокол на https

{
"authHost": "https://smartfish.danymota.com:8080",
"authEndpoint": "/broadcasting/auth",
"clients": [
    {
        "appId": "It generates it from the command init",
        "key": "It generates it from the command init"
    }
],
"database": "Your database driver",
"databaseConfig": {
    "redis": {},
    "sqlite": {
        "databasePath": "/database/laravel-echo-server.sqlite"
    }
},
"devMode": true,
"host": null,
"port": "6001", // your node js port the default is 6001
"protocol": "https", // change it here
"socketio": {},
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"apiOriginAllow": {
    "allowCors": true,
    "allowOrigin": "Your domain with the port",
    "allowMethods": "GET, POST",
    "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
}
}
person Islam ElHakmi    schedule 08.01.2019
comment
Спасибо за ответ, я обновил сообщение и добавил свой файл конфигурации LES. Как я уже сказал в посте, HTTPS работает, если я запускаю Laravel Echo в браузере. - person João Marques; 08.01.2019
comment
не могли бы вы изменить authHost с https://smartfish.danymota.com на https://smartfish.danymota.com:8080 и то же самое для allowOrigin, и скажите мне, сработало ли это - person Islam ElHakmi; 08.01.2019
comment
Спасибо, только что сделал это и ничего. Кроме того, мой хост аутентификации не работает на порту 8080, так что это, скорее всего, не проблема, и аутентификация работает как в HTTP, так и в HTTPS (браузер). - person João Marques; 08.01.2019
comment
не могли бы вы рассказать мне, что находится в консоли эхо-сервера laravel, когда вы набираете laravel-echo-server start, что вы видите? в моем случае Running at https://website.com on port 6001 ✔ Channels are ready. ✔ Listening for https events... ✔ Listening for redis events. и когда я открываю https://website.com:6001/socket.io/socket.io.js, он работает без проблем, возможно, возникла проблема с запуском сервера - person Islam ElHakmi; 08.01.2019
comment
Опять же, сервер в порядке. Работает с HTTP. И он работает даже с HTTPS, если приложение запущено в браузере. В настоящее время я работаю с Echo в HTTP, и я прекрасно публикую и подписываюсь на несколько каналов и событий. Проблема возникает, если я запускаю приложение в CLI (nodejs server.js) и в HTTPS, если я это сделаю, сервер Echo вообще ничего не регистрирует. - person João Marques; 08.01.2019
comment
в вашем Socket.io debug вы создаете новый экземпляр из https://smartfish.danymota.com:8080/socket.io, не могли бы вы изменить его на https://smartfish.danymota.com:8080/socket.io/socket.io.js - person Islam ElHakmi; 08.01.2019
comment
Не повезло, пробовал с https и с wss, но тщетно ... :( - person João Marques; 08.01.2019
comment
после поиска я обнаружил, что Port 8080 is an alternative to port 80 and is used primarily for http traffic, возможно, проблема в том, что порт используется для чего-то другого, поэтому, пожалуйста, измените порт с 8080 на 6001 и убедитесь, что он открыт, вы можете использовать ufw ufw allow 6001 здесь подробная информация об открытии портов digitalocean.com / community / tutorials / надеюсь, что это сработает - person Islam ElHakmi; 08.01.2019

Я решил эту проблему, добавив флаг rejectUnauthorized: false в laravel echo.

  this.echo = new Echo({
  broadcaster: 'socket.io',
  host: config.ECHO_SERVER,
  client: Socketio,
  rejectUnauthorized: false,
  auth: {
    headers: {
      'Authorization': 'Bearer ' + this.token.bearerToken,
    },
  },
})
person João Marques    schedule 10.01.2019