Laravel /broadcasting/auth schlägt immer mit 403-Fehler fehl

Lesezeit: 4 Minuten

Benutzer-Avatar
Lorien Darenya

Ich habe mich kürzlich mit der Laravel-Echo- und Pusher-Kombination von Laravel 5.3 beschäftigt. Ich habe erfolgreich öffentliche Kanäle eingerichtet und bin zu privaten übergegangen. Ich habe Probleme damit, dass Laravel einen 403 von der /broadcasting/auth-Route zurückgibt, egal was ich tue, um zu versuchen, die Aktion zu autorisieren (bis einschließlich der Verwendung einer einfachen return true-Anweisung). Kann mir jemand sagen was ich falsch mache?

App/Providers/BroadcastServiceProvider.php:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Broadcast::routes();

        /*
         * Authenticate the user's personal channel...
         */
        Broadcast::channel('App.User.*', function ($user, $userId) {
            return true;
        });
    }
}

resources/assets/js/booststrap.js:

import Echo from "laravel-echo"

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'My-Key-Here'
});

window.Echo.private('App.User.1')
    .notification((notification) => {
        console.log(notification.type);
    });

Ich kann das Ereignis und seine Nutzlast in meiner Pusher-Debug-Konsole sehen, es schlägt einfach fehl, sobald es die Authentifizierungsroute trifft.

Fehler 403 /broadcasting/auth mit Laravel-Version > 5.3 & Pusher, Sie müssen Ihren Code in resources/assets/js/bootstrap.js mit ändern

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'your key',
    cluster: 'your cluster',
    encrypted: true,
    auth: {
        headers: {
            Authorization: 'Bearer ' + YourTokenLogin
        },
    },
});

Und in app/Providers/BroadcastServiceProvider.php umstellen

Broadcast::routes()

mit

Broadcast::routes(['middleware' => ['auth:api']]);

oder

Broadcast::routes(['middleware' => ['jwt.auth']]); //if you use JWT

Es hat bei mir funktioniert und ich hoffe, es hilft Ihnen.

  • Dies ist NUR relevant, wenn Sie API-Token verwenden.

    – Mostafa Attia

    16. November 2018 um 18:53 Uhr

  • Ich hatte das gleiche Problem bei der Verwendung der Passauthentifizierung, ich habe nur Authorization Bear Token. jetzt ist es behoben

    – syam lal

    6. Dezember 2021 um 9:06 Uhr

  • Da ich Sanctum verwende musste ich verwenden Broadcast::routes(['middleware' => ['auth:sanctum']]); Es hängt also wirklich von der Art der Authentifizierung ab, die Sie verwenden! Aber trotzdem ein Daumen hoch dafür, dass du mich in die richtige Richtung gebracht hast 🙂 Hier sind noch ein paar Infos zum Thema: laravel.com/docs/8.x/broadcasting#authorizing-channels

    – Arno van Oordt

    2. Februar um 16:30 Uhr


Ich löse es, indem ich eine Kanalroute erstelle.

Erstellen Sie Ihre Autorisierungskanäle in routes->channels.php

Broadcast::channel('chatroom', function ($user) {
    return $user;
});

Siehe Dokumentation: https://laravel.com/docs/5.4/broadcasting#authorizing-channels

Danke

  • Die von Ihnen verlinkten Dokumente besagen, dass die Kanalmethode enthalten sein sollte … ein Callback, der wahr oder falsch zurückgibt …also warum tun Sie return $user?

    – Keine Panik

    11. Februar 2020 um 12:57 Uhr


  • @Don’tPanic, weil Sie für Präsenzkanäle Informationen über den Benutzer zurückgeben sollten, keinen booleschen Wert

    – Mikel Granero

    10. April 2020 um 0:36 Uhr

  • @MikelGranero Danke, jetzt sehe ich das Autorisieren von Präsenzkanälen Abschnitt beschreibt das. Die Frage von OP bezieht sich auf private Kanäle AFAICT, nicht auf Präsenz, daher bin ich mir nicht sicher, wie diese Antwort hilft, aber ich habe etwas gelernt 🙂

    – Keine Panik

    10. April 2020 um 0:48 Uhr


Benutzer-Avatar
Jakhongir

Ich habe socket.io mit redis gekoppelt und hatte auch ein Problem mit dem 403-Fehler, obwohl es keine Authentifizierungs-Middleware über die /broadcasting/auth-Route gab. Erst nach dem Waschen Laracasts-Lektion Ich habe herausgefunden, dass nur die Kanalautorisierung nicht ausreicht, es sollte immer einen Benutzer geben, und egal, wie Sie den Benutzer authentifizieren und erhalten, indem Sie die Standard-Laravel-Authentifizierung oder einen Token-Algorithmus verwenden – jwt oder irgendetwas anderes.

Der authentifizierte Benutzer wird automatisch aufgelöst und als erster Parameter an die Schließungsfunktionen in der Datei “routes/channels.php” übergeben, sodass Sie die Kanalverfügbarkeit für den aktuell angemeldeten Benutzer überprüfen können
Geben Sie hier die Bildbeschreibung ein

  • Vielen Dank für Ihre Antwort. Aber was ist, wenn ich meine eigene Auth-Middleware verwende, wie übergebe ich diesen autorisierten Benutzer an die Abschlussfunktion?

    – Alexej Jaremenko

    2. September 2021 um 12:33 Uhr

  • Die Antwort ist nicht die Lösung. Ich benutze Sanctum & benutze das in Auth::routes() aber immer noch diesen Fehler

    – APU

    2. Oktober 2021 um 13:29 Uhr

Überprüfen Sie, wie Sie Ihren Kanal autorisieren. Je nach Setup kann das helfen. Aktualisieren Sie Ihren BroadcastServiceProvider mit Folgendem:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;

class BroadcastServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Broadcast::routes(['middleware' => ['auth:api']]);

        require base_path('routes/channels.php');
    }
}

Fügt die Auth-API-Middleware zur Verwendung mit Laravel Passport hinzu.

Benutzer-Avatar
Juan Francisco Andrade

Was für mich funktioniert hat, war die Methode anzuwenden Privatgelände des Laravel Echo-Pakets:
https://laravel.com/docs/5.3/notifications#listening-for-notifications

Echo.private('App.User.1')
  .notification((notification) => {
  console.log(notification.type);
});

Benutzer-Avatar
Nurbol Alpysbayev

In meinem Fall war das Problem eine falsche Benutzer-ID:

Echo.private('user.'+CURRENT_USER_ID_HERE)

Benutzer-Avatar
FerrisBüller

Dies kann passieren, wenn Sie nicht mehr angemeldet sind. Stellen Sie sicher, dass Sie tatsächlich bei der Laravel-App angemeldet sind und Ihre aktuelle Sitzung nicht abgelaufen ist.

Ich habe mich wieder eingeloggt und bei mir hat es funktioniert.

1018680cookie-checkLaravel /broadcasting/auth schlägt immer mit 403-Fehler fehl

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy