Laravel Sanctum & Echo - Prywatne kanały

0

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:
https://imgupload.pl/images/2021/02/09/image.png

Ktoś mi powie co zrobiłem źle? :(

0

A tam nie powinno być w prywatnych kanałach routa na id uzytkownika ?

Broadcast::channel('user.test.{id}', function ($user) {
0

Masz gdzies to na gitlabie zeby moznabylo sciagnac i zainstalowac ?

0

Ok, sorry, że tyle to trwało.
Api: https://github.com/Klakers2/api
Front: https://github.com/Klakers2/front/

Na froncie nie dodawałem .env pliku, więc tam trzeba w paru miejscach zmienić api host.
No i tak, ja u siebie to wszystko mam na https, dlatego w paru miejscach trzeba będzie przestawić to na http.

W api config/broadcasting.php
oraz na froncie w nuxt.config.js:

wssPort: 6001

na

wsPort: 6001,

i

encrypted = false

Do websocketów korzystam z https://beyondco.de/docs/laravel-websockets/getting-started/introduction

I aby sockety działały trzeba odpalić webscoket serwer poleceniem:

php artisan websockets:serve

Mam nadzieję, że o niczym nie zapomniałem :P

No i eventy wywołuję w routes/web.php

Route::get('test', function () {
	broadcast(new \App\Events\UserTestChannel(Auth::user()));
	broadcast(new \App\Events\UserTestPresenceChannel(Auth::user()));

	return 'wyslano';
});

I logowania nie zrobiłem na froncie na razie. Dodałem do Laravela Breeze. I loguję się na api, a później jestem automatycznie zalogowany na froncie, bo sesja jest oparta na ciasteczkach.

Jeszcze kila uwag co do pliku .env:

SESSION_DOMAIN - musisz ustawić również na subdomeny (jak będziesz robił to na localhoscie i portach to nie za bardzo się orientuje jak to tam działa). Ja u siebie robię tak: **.domain.com**
SANCTUM_STATEFUL_DOMAINS - tu podaję moje subdomeny

1 użytkowników online, w tym zalogowanych: 0, gości: 1