Executando verificação de segurança...
5

[Dúvida] A melhor forma de lidar com logins

Eu estou trabalhando em um projeto para uma empresa que envolve o desenvolvimento de um app mobile para alguns funcionários responderem relatórios sobre o serviço realizado por eles dentro da empresa, e com isso surgiu uma dúvida um tanto pertinente. Eu trabalhei muito pouco com desenvolvimento mobile, então me falta algumas boas práticas sobre o desenvolvimento da estrutura de um app como esse, principalmente na questão de segurança.

A stack do app é composta por um backend em Django e o rest framework, e dois frontends em React.js e React Native. No passado, utilizei sessões com React.js para criar um ambiente de autenticação, mas nas minhas pesquisas, vi muita coisa sobre o que seria o ideal no caso de uma aplicação Rest, como a utilização de JWTs, oauth2, entre outras especificações. Por padrão, o REST Framework possui uma autenticação simples usando Tokens, porém foi aí que comecei a entender o conceito de autenticação stateless e stateful. JWTs e tokens opacos possuem algum tipo de criptografia que permite validar o conteúdo que está inserido dentro do token, enquanto tokens como do DRF não possuem esse tipo de tecnologia, ele já é uma chave associada ao usuário dentro do banco de dados. A parte boa de autenticação stateless é que enconomizamos nas consultas ao banco de dados, logicamente economizando uso do disco, mas adicionamos uma carga ao CPU, que cada consulta necessita validar o token JWT.

Algo que achei interessante no estudo dessa parte é que no geral, autenticação baseada em token, autenticação baseada em sessão e até autenticação básica são praticamente a mesma coisa, diferente do JWT que você realmente possui as informações importantes e necessárias para a aplicação. Isso porque todas essas outras autenticações recorrem ao banco de dados em algum momento para verificar o usuário.

O que eu entendi

A ideia de autenticações stateless é justamente diminuir a carga do servidor, mas algo que também vi sobre essas autenticações é que no final elas nunca serão 100% stateless, e isso realmente não me importa, mas preciso que elas sejam seguras no ambiente mobile, agora o que eu não entendi corretamente é como funciona a questão de uma sessão contínua, aparentemente eu posso definir o timeout do refresh token por um tempo longo, o que já resolve esse problema, mas ainda estou incerto se é a melhor maneira de ser feito, então gostaria da opinião de vocês sobre esse assunto!

Carregando publicação patrocinada...
3

o timeout do refresh token por um tempo longo

E se uma pessoa não autorizada tiver acesso à esse token?

O maior problema de usar tokens JWT é justamente a impossibilidade de revogar eles antes da hora. Token com tempo muito longo podem abrir um bracha de segurança (hijacking)

2

E se uma pessoa não autorizada tiver acesso à esse token?

localstorage é encapsulada

quem vende cookies vende dados do db (assicioados ao user-token) (não vende token)

explain

1
1
0
1
1

Explica pra mim, cara

editei o comentário acima com um link da Mozilla explicando o que é um ataque XSS.

Mas basicamente você nunca deve confiar no browser da pessoa.

Essa pessoa pode usar extenções maliciosas que injetam scripts no navegador.

Se você não configurar certinho os headers do seu site esses script podem sim ler o LocalStorage, cookies que não estão marcados como HTTPOnly, qualquer input de formulários e qualquer informação presente na página.

leia este artigo para entender boas práticas de onde salvar cada coisa

e acho que você(s) estão equivocados

Entre você e na empresa que desenvolve um dos maiores navegadores eu vou confiar em quem?

1
4

Mas interceptar token não é relevante.

Interceptando um token tornaria um atacante acessando um site como se fosse seu usuário.

esse atacante poderia ver todas as informações disponíveis, fazer todas as modificações que esse usuário tem permissão de fazer.

Imagina esse nível de acesso em um sistema empresarial?

Por meio dessa interceptação de token tenho amigos que tiveram todos os seus vídeos do youtube apagados e um vídeo de tigrinho postado.

Imagina um canal com 2 milhões de seguidores ter todos os seus vídeos apagados ...

Como isso poder ser perigoso ?

Isso me diz muito como você leva a sério seu próprio trabalho

Eu aposto um pouquinho da minha reputação aqui cara.

A gente tá na internet, ninguem se importa com a sua reputação ...

1

Sobre "se alguém interceptasse/setasse um token"
Realmente voce tem razão.
ME desculpe(m) pelos comentários.

Mas sobre como intercepetar/setar:
o user precisaria executar um js na sua página ou usar um browser acreditando que está no chrome
Acho que só dessas duas maneiras tem Jeito.

Eu me importo com minha reputação, com os rumos que a internet toma, com a comunidade...

5

Acho que só dessas duas maneiras tem Jeito.

Ou usar uma extensão de navegador comprometida (ja falei duas vezes em outros comentários)

Extensões de navegador são extremamente inseguras.

Não controlamos as extensões que os usuários instalam, não devemos acreditar que eles tem capacidade técnica suficiente para identificar se uma extensão é maliciosa

2
1

Opa, tudo bem?

Fazer um CRUD de usuários não é necessário pois o Django já traz uma abstração completa para realizar o CRUD, tanto de usuários, quanto de grupos e permissões! 😃

Meu problema está relacionado com a identidade e identificação deles, por exemplo: você é o usuário Rodrigo, você consegue fazer posts aqui no TabNews sobre esse nome, mas como você garante que será sempre você que estará fazendo posts aqui e não um impostor? Se sua identidade for roubada, seria possível você provar que a pessoa que roubou não é você?

É aí que entra os métodos de autenticação. Para não precisar você adicionar o email e a senha toda vez que você entrar no site ou toda vez que fizer um post, o servidor cria uma sessão, essa sessão pode ser criada de diferentes formas. Você pode criar uma entrada no banco de dados que identifica seu computador ou celular, você pode criar um token, que é uma espécie de assinatura compartilhada com você e que identifica seus dados, e ainda existem métodos menores, que no final das contas fazem a mesma coisa que os dois citados acima.

Por exemplo, no JWT você gera duas assinaturas, mas cada assinatura tem uma validade por tempo e ação. O token/assinatura de acesso permite que você publique um post no TabNews, mas depois que você faz esse post, por exemplo, esse token deixa de ser válido, então você precisa de um novo token. Mas como você vai fazer isso? Você vai usar a outra assinatura, ou token, o token de atualização. Esse token só pode ser usado uma vez, mas ele dura muito tempo. Para melhor entendimento, imagina que você quer fazer uma compra no nome de outra pessoa, para você fazer uma compra, você precisa da autorização dela, essa autorização pode permitir você fazer múltiplas compras ou apenas uma, mas isso também depende da validade, então a cada x dias esse documento fica inválido e você precisa emitir outro com a ajuda dela.

A questão é justamente essa, um token de atualização também não dura pra sempre, ele precisa ser atualizado, pelo menos a cada vez que um novo token de acesso é emitido, mas se o usuário ficar muito tempo fora da rede social, do website, aí sim nesse caso seria necessário a pessoa fazer uma identificação com email e senha, ele seria desconectado.

Essa é uma forma simplificada de explicar, mas os detalhes de segurança são muito mais extensos do que isso, e existem outros métodos. Por exemplo, a questão de stateless e stateful pode ser explicado ao fato de que um token JWT possui detalhes mais amplos sobre o usuário, para que não seja necessário consultar o banco de dados e sim só decodificar, então ele pode ser qualificado como stateless, por não ser necessário estado... Entre outros detalhes.

2

Para não precisar você adicionar o email e a senha toda vez que você entrar no site ou toda vez que fizer um post

O browser armazena tokens.
Alguns até na localstorage

Alguns em outras camadas.

Dá pro dev definir eles ou alguma ferramenta define eles

O django relciona determinado token com determinado user (no db)
Se fizer em python sem Django também funciona
E em outras camados do server tbm

1
1

Uma das formas hoje de provar que a pessoa é ela mesmo, é com um certificado digital, ou através da biometria facial/impressão digital.

Eu iria por uma solução mais simples: usar providers como Google (recomendo Firebase, ver Auth), ou um Keycloak.

0
1

software powerful, testado e aprovado, dá um trabalho se for ter wue custimizar com form para leads ou coisas que deveriam ser expostas somente depois do auth, tipo georreferenciamento, replica... Mas como federação, é muito parrudo, completo mesmo... em 2 meses já dá pra dominar tudo o que precisa

1

Pelo que pesquisei, parece ser uma plataforma de login compartilhado entre aplicações. Por mais interessante que pareça, não acho que encaixe no meu problema atual, que é gerenciar a autenticação de usuários de forma simples. E me parece que o keycloak é um pouco mais do que eu gostaria.