Introdução
A autenticação é o processo de verificar a identidade dos usuários durante solicitações de login. Em um processo de autenticação, os usuários fornecem suas credenciais como nomes de usuário e senhas. Em seguida, a aplicação compara essas credenciais de login com entradas armazenadas no banco de dados. A aplicação concede acesso aos usuários ao sistema se houver uma correspondência.
Armazenar credenciais de login em um banco de dados relacional como MySQL ou PostgreSQL sem um mecanismo de cache ainda é uma abordagem comum e prática, mas vem com as seguintes limitações:
-
Sobrecarga do banco de dados. A aplicação deve fazer uma viagem de ida e volta para o servidor de banco de dados para verificar as credenciais dos usuários em uma tabela do banco de dados cada vez que um usuário envia uma solicitação de login. Como o banco de dados ainda pode atender outras solicitações de leitura/gravação, todo o processo sobrecarrega o banco de dados e o torna lento.
-
Bancos de dados tradicionais baseados em disco têm problemas de escalabilidade. Quando sua aplicação recebe milhares de solicitações por segundo, os bancos de dados baseados em disco não funcionam de forma ideal.
Para superar os desafios mencionados acima, você pode usar o Redis para armazenar em cache as credenciais de login dos usuários, para que sua aplicação não precise entrar em contato com o banco de dados backend a cada solicitação de login. O Redis é um dos armazenamentos de dados ultrarrápidos mais populares, que utiliza a RAM do seu computador para armazenar dados em pares de chave-valor. Neste guia, você usará o banco de dados Redis para acelerar o gerenciamento de sessões em sua aplicação Python/MySQL no servidor Ubuntu 22.04.
Pré-requisitos
Antes de começar este tutorial, será necessário configurar o seguinte:
-
Altere para a nova conta de usuário
sudo
e instale:
Passo 1 — Instalando Drivers de Banco de Dados Python para Redis e MySQL
Esta aplicação armazena permanentemente as credenciais dos usuários, como nomes e senhas, em um servidor de banco de dados MySQL. Quando um usuário faz login na aplicação, um script em Python consulta o banco de dados MySQL e compara os detalhes com os valores armazenados. Em seguida, o script Python armazena em cache as credenciais de login do usuário em um banco de dados Redis para atender a outras solicitações futuras. Para concluir essa lógica, seus scripts Python precisam de drivers de banco de dados (módulos Python) para se comunicarem com os servidores MySQL e Redis. Siga as etapas abaixo para instalar os drivers:
- Atualize o índice de informações do seu pacote e execute o seguinte comando para instalar
python3-pip
, um gerenciador de pacotes Python que permite instalar módulos adicionais que não fazem parte da biblioteca padrão do Python.
- Instale o driver MySQL para Python:
- Instale o driver Redis para Python:
Depois de instalar os drivers necessários para se comunicar com o MySQL e o Redis, prossiga para a próxima etapa e inicialize um banco de dados MySQL.
Passo 2 — Configurando um Exemplo de Banco de Dados MySQL
Para este guia, você precisa de uma tabela MySQL. Em um ambiente de produção, você pode ter dezenas de tabelas que atendem a outras solicitações. Configure um banco de dados e crie a tabela executando os seguintes comandos:
-
Acesse o servidor do banco de dados MySQL como usuário
root
: -
Insira a senha do
root
do seu servidor MySQL quando solicitado e pressioneENTER
para prosseguir. Em seguida, execute o seguinte comando para criar um banco de dados de exemplo chamadocompany
e uma conta de usuáriocompany_user
. Substituaexample-mysql-password
por uma senha forte:
-
Verifique se você recebe a seguinte saída para confirmar que os comandos anteriores foram executados com sucesso:
-
Mude para o novo banco de dados
company
: -
Confirme que você está conectado ao novo banco de dados verificando a seguinte saída:
-
Crie uma tabela
system_users
. A colunauser_id
serve como chave primária para identificar cada usuário de forma única. As colunasusername
epassword
são as credenciais de login que os usuários devem fornecer para acessar o aplicativo. As colunasfirst_name
elast_name
armazenam os nomes dos usuários: -
Certifique-se de ter criado a nova tabela verificando a seguinte saída:
-
Popule a tabela
system_users
com dados de exemplo. Use a função interna do MySQLMD5(...)
para cifrar a senha por motivos de segurança: -
Verifique a saída abaixo:
-
Consulte a tabela
system_users
para garantir que os dados estejam no lugar: -
Verifique a seguinte saída:
-
Sair do banco de dados MySQL:
Agora você configurou corretamente o banco de dados MySQL para sua aplicação. No próximo passo, você construirá um módulo Python comunicando-se com seu banco de dados de exemplo.
Passo 3 — Criando um Módulo Central de Gateway MySQL para Python
Ao codificar qualquer projeto Python, você deve criar um módulo separado para cada tarefa para promover a reutilização de código. Neste passo, você configurará um módulo central que permite conectar e consultar o banco de dados MySQL a partir de um script Python. Siga as etapas abaixo:
-
Crie um diretório
project
. Este diretório separa seus arquivos de código-fonte Python do restante dos arquivos do sistema: -
Mude para o novo diretório
project
: -
Use o editor de texto
nano
para abrir um novo arquivomysql_db.py
. Este arquivo abriga o módulo Python que se comunica com o banco de dados MySQL: -
Insira as seguintes informações no arquivo
mysql_db.py
. Substituaexample-mysql-password
pela senha correta do MySQL para a contacompany_user
:~/projeto/mysql_db.py -
Salve e feche o arquivo
mysql_db.py
.
O arquivo de módulo mysql_db.py
possui uma classe (MysqlDb:
) com dois métodos:
– db_con(self):
, conecta-se ao banco de dados de exemplo company
que você criou anteriormente e retorna uma conexão MySQL reutilizável usando a declaração return mysql_con
.
– query(self, username, password):
, um método que aceita um username
e password
e consulta a tabela system_users
para verificar se há correspondência. A declaração condicional if row_count < 1: ... else: return result[1]
retorna o valor booleano False
se um usuário não existir na tabela ou a senha do usuário (result[1]
) se o aplicativo encontrar uma correspondência.
Com o módulo MySQL pronto, siga para o próximo passo para configurar um módulo Redis semelhante que se comunique com o armazenamento de chave-valor do Redis.
Passo 4 — Criando um Módulo Redis Central para Python
Neste passo, você codificará um módulo que se conecta ao servidor Redis. Execute os seguintes passos:
-
Abra um novo arquivo
redis_db.py
: -
Insira as seguintes informações no arquivo
redis_db.py
. Substituaexample-redis-password
pela senha correta do servidor Redis:~/projeto/redis_db.py -
Salve e feche o arquivo
redis_db.py
.
-
O arquivo acima possui uma classe (
RedisDb:
). -
Dentro desta classe, o método
db_con(self):
utiliza as credenciais fornecidas para se conectar ao servidor Redis e retorna uma conexão reutilizável usando a instruçãoreturn redis_con
.
Após configurar a classe Redis, crie o arquivo principal para o seu projeto no próximo passo.
Passo 5 — Criando o Ponto de Entrada da Aplicação
Toda aplicação Python deve ter um ponto de entrada ou o arquivo principal que é executado quando a aplicação é iniciada. Neste arquivo, você criará um código que mostra a hora atual do servidor para usuários autenticados. Este arquivo utiliza os módulos personalizados MySQL e Redis que você criou para autenticar os usuários. Siga os passos abaixo para criar o arquivo:
-
Abrir um novo arquivo
index.py
: -
Insira as seguintes informações no arquivo
index.py
:~/projeto/index.py -
Salve e feche o arquivo
index.py
.
-
No arquivo
index.py
, a seçãoimport...
adiciona os seguintes módulos ao seu projeto:-
utf_8
,base64
,md5
ejson
, módulos de codificação e formatação de texto. -
http.server
,HTTPStatus
esocketserver
, módulos de servidor web. -
datetime
, módulo de data/hora. -
mysql_db
eredis_db
, módulos personalizados que você criou anteriormente para acessar os servidores MySQL e Redis.
-
-
O
HttpHandler(http.server.SimpleHTTPRequestHandler):
é uma classe de manipulador para o servidor HTTP. Sob a classe, o métododo_GET(self):
serve as solicitações HTTP GET e exibe a data/hora do sistema para usuários autenticados. -
No logic
if ... : else: ...
, o script Python executa oif redis_client.exists(auth_user):
para verificar se as credenciais do usuário existem no servidor Redis. Se os detalhes do usuário existirem e a senha armazenada no Redis não corresponder à senha enviada pelo usuário, o aplicativo retorna o erro{"error": "Nome de usuário/senha inválido."}
.
Se os detalhes do usuário não existirem no servidor Redis, a aplicação consulta o servidor de banco de dados MySQL usando a instrução mysql_resp = mysql_server.query(auth_user, auth_password)
. Caso a senha fornecida pelo usuário não corresponda ao valor armazenado no banco de dados, a aplicação retorna o erro {"error": "Nome de usuário/senha inválido."}
. Caso contrário, a aplicação armazena em cache os detalhes do usuário no servidor Redis usando a instrução redis_client.set(auth_user, mysql_resp)
.
-
Em todos os casos em que as credenciais do usuário correspondem aos detalhes do Redis/MySQL, a aplicação exibe a data/hora atual do sistema usando a declaração
{"time": current_time, ...}
. A entradaauthorized by
na saída permite visualizar o servidor de banco de dados que autentica os usuários na aplicação.
Você agora configurou o arquivo principal do aplicativo. No próximo passo, você testará o aplicativo.
Passo 6 — Testando o Aplicativo
Neste passo, você executará seu aplicativo para verificar se o mecanismo de cache do Redis está funcionando. Execute os comandos abaixo para testar o aplicativo:
-
Use o seguinte comando
python3
para executar o aplicativo: -
Garanta que o servidor web personalizado do aplicativo esteja em execução:
-
Estabeleça outra conexão
SSH
com o seu servidor em uma nova janela de terminal e execute os seguintes comandoscurl
para enviar quatro solicitações GET usando as credenciais dejohn_doe
. Adicione[1-4]
ao final do URLhttp://localhost:8080/
para enviar as quatro solicitações em um único comando: -
Verifique as seguintes saídas. O servidor MySQL serve apenas o primeiro pedido de autenticação. Em seguida, o banco de dados Redis atende aos três pedidos seguintes.
A lógica da sua aplicação agora está funcionando conforme o esperado.
Conclusão
Neste guia, você construiu uma aplicação Python que utiliza o servidor Redis para armazenar em cache as credenciais de login dos usuários. O Redis é um servidor de banco de dados altamente disponível e escalável que pode realizar milhares de transações por segundo. Com o mecanismo de cache do Redis em sua aplicação, você pode reduzir significativamente o tráfego em seu servidor de banco de dados backend. Para saber mais sobre aplicações Redis, consulte nossos tutoriais do Redis.