-
Notifications
You must be signed in to change notification settings - Fork 401
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
useUser()
: somente bater no endpoint se existir cookie indicando sessão
#336
Comments
Isso! E essa chamada temporária pode ser só na tela de login, para já eliminar o Assim, se o usuário ainda não tem o cookie com o Lembrando que isso de aparecer como deslogado só vai acontecer para quem já está previamente autentitcado, mas ainda não acessou a versão nova para obter o cookie. |
Estou querendo pegar essa issue amanhã se tudo der certo! hehehe Comentário apenas pro @filipedeschamps trabalhar em outra frente se for o caso. |
Ta pensando aqui, essa feature tem 3 pontos de interação:
Talvez para cobrir tudo de forma centralizada, a gente pode trabalhar dentro do model Tudo começa aqui nesse middleware que é declarado em basicamente todas as rotas: tabnews.com.br/models/authentication.js Line 25 in 15fe956
E se o usuário está autenticado (que é o caso que queremos), a chamada entra aqui: tabnews.com.br/models/authentication.js Line 39 in 15fe956
E se a sessão existe no banco de dados (e ela ainda está válida) e o usuário existe e possui todas as permissões, a sessão é renovada aqui: tabnews.com.br/models/authentication.js Line 51 in 15fe956
E renovar significa duas coisas:
tabnews.com.br/models/session.js Lines 99 to 100 in 15fe956
Hoje esse método não recebe o Fora isso, na hora de fazer o login (que é criar uma sessão), existe essa chamada:
E esse método também usa o tabnews.com.br/models/authentication.js Line 78 in 15fe956
Que novamente, poderia ser renomeado para algo mais genérico e que faça comportar também username. Assim, todas as rotas que injetam o usuário vão ganhar esse recurso de graça e teremos mais elasticidade para adicionar ou remover cookies de autenticação de uma forma centralizada. O que acham? Como último ponto de observação, quando um controller recebe um erro de Autorização, ele chama esse método que limpa o tabnews.com.br/models/controller.js Line 36 in 2c34a1f
Ele também deveria ser algo mais genérico e gente poderia renomear o método |
Em paralelo, me veio agora uma outra idéia que não pensei muito a fundo, mas acho que vai ajudar muito na performance da interface:
Em resumo, seria uma estratégia de |
Estava pensando em usar algo como isso, olha que legal: https://github.com/leoafarias/use-state-persist Alguém conhece algo mais atualizado? |
Opa, são dois problemas...
|
Show de bola!! E não acho que é uma solução temporária, ter o user local (mesmo que stale), vejo que é uma ótima solução.
Em paralelo, eu vi que o SWR tem um suporte para local cache, olha só: Achei bem legal a solução 2 ali. Em paralelo, quando o Bom, não vou mexer nisso agora, quero me focar nas issues de voltar o número de comentários pela API 🤝 |
Dos dois problemas, o primeiro é resolvido no PR #440. Já o segundo, como mexe com o design, acho que dá pra ficar para uma nova Issue. |
Eu estava pensando em implementar exatamente assim! hehehe Infelizmente meus dias (e finais de semana 😅) estão concorridos e ainda não consegui por a mão nessa issue. |
Edit. Eu tinha invertido direita e esquerda 😅
Não percebo esse pulinho pra baixo. O que me incomoda mais é o deslocamento do botão de Status que faz coisas piscarem... Se esse botão permanecer na direita e os componentes que só surgem no segundo render ficarem mais para a esqurda, já fica uma transição "suave". Se acharem que compensa ver como fica (eu já testei aqui e curti), posso colocar isso no PR #440 ou, melhor ainda, no #425 (que, entre outras coisas, fixa o Header no topo). Ou testem por si, movendo o Status lá para o final do componente Header: ...
)}
<Header.Item>
<Header.Link href="/status" fontSize={2}>
Status
</Header.Link>
</Header.Item>
</Header>
);
} |
Issue fechada por dois PRs, dado que ela foi atacada em duas Fases:
Todas lideradas por @aprendendofelipe |
Fora a UX muito melhor de usar o localStorage para mostrar o menu lá em cima, essa é a situação de erros do TabNews antes desse deploy, os erros do endpoint |
@filipedeschamps a maioria dos acessos são de usuários anônimos? |
@rodrigoKulb ótima pergunta! Eu não saberia dizer, preciso pensar em como montar uma query que agrupe isso 🤝 se eu conseguir mando o print em algum momento 👍 |
Contexto
O hook useUser é usado para coisas como, no cabeçalho do TabNews mostrar os links de Login/Cadastro se a pessoa não estiver autenticada, ou mostrar o dropdown com o
username
do usuário.Ele também é usado para mostrar ou não aquele botão adicional de editar o seu próprio conteúdo no componente Content.
Ainda nesse componente, ele também é usado para mostrar uma mensagem caso a pessoa não esteja logada.
O problema é que hoje, independente da condição do usuário estar logado ou não, ele bate no endpoint
/api/v1/user
e isso está causando bastante ruído nos logs, pois todas as pessoas que estão visitando o site e não estão logadas, por trás dos panos estão tomando um403
... e esses403
estão se acumulando. Precisamos limpar isso, o que também irá parar de "flickar" o cabeçalho durante essa verificação (faça um refresh no TabNews e note que agonia, não aparece nada enquanto o endpoint não retorna).Execução
Ao fazer Login (criar uma sessão), o backend devolve um cookie
session_id
mas que por questões de segurança ele não pode ser lido pelo client-side, então hoje não dá para saber se a pessoa está logada ou não sem bater na rota citada acima.Dito isso, a ideia geral é na linha de: se não houver algum outro identificado estático de que sinalize que a pessoa possa estar logada, não fazer a request citada acima, porque com certeza vai tomar um
403
. Se a pessoa tiver esse identificador, isso também não é garantia que ela continua logada, então nesse caso deve ser feita a request... que caso tome um403
, daí deve se remover esse identificador.Mas agora as dúvidas são: esse identificador deve ser o que? Um cookie? Um item no localStorage? Quem deve setar ele, o client ou server? Em que momento? No momento do Login? Mas e as pessoas que já passaram pelo estágio de Login e se mantém logadas, como fazer uma feature que seja compatível com elas também (porque elas não terão de início o identificador)? Então será que nesse caso a rota
/api/v1/user
deveria retornar um cookie adicional que seja acessível pelo client-side?Talvez o
/api/v1/user
sempre deva retornar um cookie com ousername
atual do usuário (porque ele pode mudar isso) e essa informação pode ser usada como o identificador. Se não tiver esse cookie, a pessoa está deslogada. Das pessoas que já estão logadas, mas também não tem esse cookie, na próxima chamada do/api/v1/user
elas vão receber o cookie (o problema é como fazer elas chamarem o endpoint, dado que nosso objetivo agora é parar de chamar o endpoint se não tiver esse identificador). Talvez fazer uma chamada manual temporária, e remover isso depois de 30 dias. Enfim, se a pessoa tiver esse cookie, já instantaneamente usar isso como ousername
que aparece no cabeçalho para parar o flicker.The text was updated successfully, but these errors were encountered: