Cześć,
Tym razem wyłożyłem się na autoryzacji lub czymś innym w kanałach prywatnych oraz obecności. Zwykłe kanały działają prawidłowo. Dochodzą poprawnie websockety.
Korzystam z Laravela.
Do autoryzacji wykorzystuję Laravel Sanctum w trybie SPA (bez tokenów).
Na froncie mam NuxtJS (Vue) i korzystam z Laravel Echo do odbierania websocketów.
Wszystkie frameworki i pluginy są w najnowszej wersji.
Moje liczne próby zawiodły, a tak poza tym, z tego co teraz widzę to były niepotrzebne. No ale napiszę:
Moja instancja Laravel Echo w nuxt.config.js wygląda następująco:
echo: {
broadcaster: 'pusher',
key: Mój klucz',
authEndpoint: 'https://mydomain.com/broadcasting/auth',
wsHost: 'mydomain.com',
wssPort: 6001,
disableStats: true,
encrypted: true,
},
Wcześniej próbowałem dodawać do niego:
- authModule: true,
Ale to było z myślą o Nuxt Auth v4 od którego się odchodzi, a Teraz jest Nuxt Auth Next v5.
Oraz authorizera: https://laravel.com/docs/8.x/sanctum#authorizing-private-broadcast-channels
Ale to wszystko nieważne.
Zauważyłem, że po stronie frontu, gdy moja instancja Laravel Echo wygląda tak jak pokazałem wyżej - niby wszystko działa (mam na myśli autoryzację).
Takie wnioski wysuwam po tym, że gdy zmienię mój authEndpoint na coś fałszywego - pojawią się bład 404. Z kolei gdy w backendzie w generowaniu tras zmienię
Broadcast::routes(['middleware' => ['auth:sanctum']]);
na
Broadcast::routes();
To otrzymuję 403.
Więc gdy mam poprawny authEndpoint i generowanie tras na middleware ustawione na sanctum - nie ma żadnego błędu na froncie. Mimo wszystko kanały prywatne i obecności nie odbierają powiadomień.
Tak wygląda mój Event:
class UserTest implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($user)
{
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PresenceChannel('user.test');
}
}
I tak autoryzacja w channels.php
Broadcast::channel('user.test', function ($user) {
return $user->id == 1; // Dla testów
return true;
// Jedno i drugie nie przynosi efektu
});
Zauważyłem też, że jak w channels.php dodam testowe logi - to sie nie zapisują, czyli to nawet nie jest sprawdzane czy użytkownik ma dostęp do tego kanału. Oczywiście dawałem logi też wszędzie indziej - pojawiają się poprawnie. No i jak zmieniłem te kanał na publiczny to wszystko działa poprawnie.
Dodam jeszcze, że do authEndpointu wysyłane są dane jak na screenie poniżej i otrzymuję odpowiedź 302:
Ktoś mi powie co zrobiłem źle? :(