[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Altenir
Criador Altenir 27/12/2023

usei uma aplicação que eu tenho em vue e consegui fazer envair notificação public channel para usuários diferentes, já ajuda para o que eu quero não precisa realmente se privado, para usuários autenticados via API não consegui, a mensagem é que não consegue autenticar. 

Manager Carlos Ferreira 27/12/2023

Olá, Altenir!

Tudo bem?

 

Compartilhe comigo por favor, os detalhes do projeto, parte do código ou integral. Preciso de mais detalhes para conseguir te ajudar.

 

Como está a autenticação da API? O que usou?

Carlos Ferreira
Criador Altenir 27/12/2023

Tudo bem Carlos

Pois é, eu tinha  colocado aqui todo o passo a passo completo que eu fiz, mas agora que vi que não salvou.

Eu consegui fazer autenticar, umas das coisas que falta era colocar o middleware na rota do BroadcastServiceProvider.php, aí ficou autenticando mas não envia notificação.

vou responder por parte porque não esta aceitando enviar tudo

 

BroadcastServiceProvider.php

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

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

 

PostCreated.php

 
    public function broadcastOn()
    {
        return [
            new Channel('post-created'),
            new Channel('user-'.$this->post->user_id),
            new PrivateChannel('App.Models.Security.User.' . $this->post->user_id),
        ];
    }

 

Altenir
Criador Altenir 27/12/2023


continuação...

PostCreated.php

 
    public function broadcastOn()
    {
        return [
            new Channel('post-created'),
            new Channel('user-'.$this->post->user_id),
            new PrivateChannel('App.Models.Security.User.' . $this->post->user_id),
        ];
    }

 

channels.php

Broadcast::channel('App.Models.Security.User.{id}', function ($user, $id) {
    return (int) $user->id === (int) $id;
});

 

Altenir
Criador Altenir 27/12/2023


continuação...

 

Index.vue

onMounted(() => {
const userLogado = LocalStorage.getItem('mjcTokenUser')
      window.Echo.connector.options.auth.headers.Authorization = 'Bearer 5|OPMv7UHr2dIWPAoX7iWv6d9vNmhLIYf6AdWsrpRR2d9eaded'

      //* Canal privado
      window.Echo.private(`App.Models.Security.User.${userLogado.user.id}`).listen(
        'PostCreated',
        (e) => {
          console.log(e)
          console.log(e.post)
        }
      )

      //! Canal publico
      window.Echo.channel('laravel_database_post-created').listen(
        'PostCreated',
        (e) => {
          console.log(e)
          console.log(e.post)
        }
      )
}
Altenir
Manager Carlos Ferreira 27/12/2023

Posta o código no GitHub, porque fica mais fácil visualizar, e também ver versões dos packages e etc.

Carlos Ferreira
Criador Altenir 27/12/2023

https://github.com/altenir/company

Altenir
Manager Carlos Ferreira 27/12/2023

Show, compartilhe comigo um print dos logs do laravel-echo-server quando o evento do private channel é disparado.

Carlos Ferreira
Criador Altenir 27/12/2023

https://imgur.com/a/m7lOHET

Altenir
Criador Altenir 27/12/2023

segue outro print, veja que está autenticando, isso sgnifica que no vue está correto e que está se concatando com o server, certo?
e também rodando os events, o usuário logado é id 11, mas não recebe a notificação

https://imgur.com/xXSoCm9

Altenir
Criador Altenir 27/12/2023

aqui deixei só um pra melhorar a visualização

https://imgur.com/31pmOnk

Altenir
Criador Altenir 27/12/2023

aqui mostro que sem autenticação está normal

 

https://imgur.com/a/i08QtKv

Altenir
Manager Carlos Ferreira 27/12/2023

Obrigado pelos prints.

 

O problema está no nome do channel, aqui vc deixou:

'laravel_database_post-created'

 

Mas, se olhar esse print: https://imgur.com/31pmOnk

O nome do channel final ficou: private-App.Models.Security.User.{id_usuario_aqui}

 

--

 

É possível "forçar" o nome do evento:

https://laravel.com/docs/10.x/broadcasting#broadcast-name

Carlos Ferreira
Criador Altenir 27/12/2023

Não entendi. tentei /broadcasting#broadcast-name mas não funcionou

Os nomes são esses, é são os nomes que são usados no vue, os únicos que funcionam são os que não precisam de autenticação, que são post-created e user-...

 

App.Models.User. AUTENTICA COMO NO PRINT MAS NÃO ENVIA NOTIFICAÇÃO, como se ele está autenticado e está disparando o evento, eu já tentei de diversas formas, até mudando o nome, tentei muitas coisas, mas não deu certo

new Channel('post-created'),
            new Channel('user-'.$this->post->user_id),
            new PrivateChannel('App.Models.Security.User.' . $this->post->user_id),
 
 
 
 
App.Models.User.'
Altenir
Criador Altenir 27/12/2023

se lá no client VUE eu colocar esse prefixo private- na frente do nome do canal App.Models.User. ele para de autenticar, já no não autenticado não tem problema colocar o prefixo

 

[2024-01-03T01:47:30.674Z] - Preparing authentication request to: http://192.168.100.38:3333

[2024-01-03T01:47:30.675Z] - Sending auth request to: http://192.168.100.38:3333/broadcasting/auth

[2024-01-03T01:47:30.884Z] - aFm7WIj64BwxMIs-AAAB authenticated for: private-App.Models.User.11

[2024-01-03T01:47:30.884Z] - aFm7WIj64BwxMIs-AAAB joined channel: private-App.Models.User.11

Altenir
Criador Altenir 27/12/2023

até agora fiz váris coisa e não resolveu, mas resumindo o que está contecendo é isso aqui, o problema é o prefixo que é adiconado ao nome do canal

autorização em canais privados funciona bem, mas as mensagens continuam sendo enviadas no canal errado, usando o prefixo no nome do canal.

Altenir
Manager Carlos Ferreira 27/12/2023

Vou precisar simular aqui, vc está usando o Redis?

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!