1
resposta

Erro 403 ao tentar autenticar private channel com laravel e pusher

Não estou conseguindo autenticar um canal privado com laravel e pusher

BroadcastServiceProvider

public function boot()
    {
        Broadcast::routes(['middleware' => ['auth:api']]);

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

Channels.php

Broadcast::routes();

Broadcast::channel('private-carrega-preflight-channel.{idEmpresa}', function ($user, $idEmpresa) {
    info('Canal Preflight Autenticado');

    return $user->id_empresa == $idEmpresa;
});

configurações do pusher e private channel no blade

var pusher = new Pusher('{{ config('broadcasting.connections.pusher.key') }}', {
            cluster: '{{ config('broadcasting.connections.pusher.options.cluster') }}',
            authEndpoint: "{{ url('/broadcasting/auth') }}",
            encrypted: true,
            auth: {
                headers: {
                    'X-CSRF-Token': '{{ csrf_token() }}',
                }
            }
        });

        var private = pusher.subscribe('private-carrega-preflight-channel.' + idEmpresa);
            private.bind('carrega-preflight-event', function(data) {

            toastr.success(JSON.stringify(data.nomeProjeto) + ' Preflight carregado com sucesso!');
            toastr.options.closeDuration = 700;

            //recarrega a div na mesma url sem recarregar a página toda
            $("#tabela").load(location.href + " #tabela>*", "");
            
        });
1 resposta

Olá Marcos, tudo bem?

O erro 403 geralmente ocorre quando a autenticação falha. No seu caso, a autenticação está sendo feita no canal privado, que é o private-carrega-preflight-channel.{idEmpresa}.

A primeira coisa que eu verificaria é se o usuário está realmente autenticado e se a idEmpresa que você está passando para o canal é a mesma que está associada ao usuário.

No seu código, você está retornando $user->id_empresa == $idEmpresa; na função do canal, o que significa que o usuário só será autenticado se a idEmpresa dele for igual à que você está passando. Se isso não acontecer, a autenticação falhará e você receberá o erro 403.

Você pode fazer um teste rápido para verificar se essa é a causa do problema. Tente retornar true na função do canal, independentemente da idEmpresa do usuário. Se o erro 403 desaparecer, então o problema está na comparação das id's.

Broadcast::channel('private-carrega-preflight-channel.{idEmpresa}', function ($user, $idEmpresa) {
    info('Canal Preflight Autenticado');

    return true;
});

Se o erro persistir, então o problema pode estar em outra parte do seu código. Nesse caso, eu sugeriria que você verifique as configurações do Pusher e a URL do authEndpoint. Certifique-se de que a chave e o cluster estão corretos e de que a URL do authEndpoint está apontando para o local certo.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.