Introdução
A autenticação é o processo de verificar a identidade dos usuários durante as solicitações de login. Em um processo de autenticação, os usuários enviam 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:
-
Sobrecarregando o banco de dados. A aplicação deve fazer uma ida e volta para o servidor de banco de dados para verificar as credenciais dos usuários em uma tabela de banco de dados cada vez que um usuário envia uma solicitação de login. Como o banco de dados ainda pode atender a 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, bancos de dados baseados em disco não têm um desempenho ideal.
Para superar os desafios 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 contatar o banco de dados backend durante cada solicitação de login. O Redis é um dos mais populares bancos de dados ultrarrápidos que utiliza a RAM do seu computador para armazenar dados em pares 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, você precisará configurar o seguinte:
-
Alterne 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 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 completar essa lógica, seus scripts Python requerem drivers de banco de dados (módulos Python) para se comunicar 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.
Etapa 2 — Configurando um Banco de Dados MySQL de Exemplo
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ário chamadacompany_user
. Substituaexample-mysql-password
por uma senha forte:
-
Assegure-se de receber 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 umaPRIMARY KEY
para identificar cada usuário de forma única. As colunasusername
epassword
são as credenciais de login que os usuários devem enviar para acessar o aplicativo. As colunasfirst_name
elast_name
armazenam os nomes dos usuários: -
Assegure-se de ter criado a nova tabela verificando a seguinte saída:
-
Popule a tabela
system_users
com dados de exemplo. Use a funçãoMD5(...)
embutida no MySQL 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:
-
Desconectar do banco de dados MySQL:
Agora você configurou o banco de dados MySQL correto para sua aplicação. No próximo passo, você irá construir um módulo Python que se comunica com o seu banco de dados de exemplo.
Etapa 3 — Criando um Módulo Central de Gateway MySQL para Python
Ao codificar qualquer projeto em Python, você deve criar um módulo separado para cada tarefa para promover a reutilização de código. Nesta etapa, você configurará um módulo central que permite conectar e consultar o banco de dados MySQL a partir de um script Python. Siga os passos 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
projeto
: -
Use o editor de texto
nano
para abrir um novo arquivomysql_db.py
. Este arquivo hospeda 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 do 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 encontrar se há uma 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 a aplicação encontrar uma correspondência.
Com o módulo MySQL pronto, siga para a próxima etapa para configurar um módulo Redis similar que se comunique com o armazenamento de chave-valor do Redis.
Etapa 4 — Criando um Módulo Central do Redis para Python
Nesta etapa, você irá 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 dessa 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 na próxima etapa.
Passo 5 — Criando o Ponto de Entrada da Aplicação
Toda aplicação em Python deve ter um ponto de entrada ou o arquivo principal que é executado quando a aplicação é iniciada. Neste arquivo, você irá criar um código que exibe a hora atual do servidor para usuários autenticados. Este arquivo utiliza os módulos personalizados MySQL e Redis que você criou para autenticar usuários. Siga os passos abaixo para criar o arquivo:
-
Abra 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 de texto e formatação. -
http.server
,HTTPStatus
esocketserver
, módulos do servidor web. -
datetime
, módulo de tempo/data. -
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 manipuladora para o servidor HTTP. Sob a classe, o métododo_GET(self):
atende às solicitações HTTP GET e exibe a data/hora do sistema para usuários autenticados. -
No lógica
if ... : else: ...
, o script Python executa a instrução lógicaif 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, a aplicação retorna o erro{"error": "Nome de usuário/senha inválidos."}
.
Se os detalhes do usuário não existirem no servidor Redis, o aplicativo 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, o aplicativo retorna o erro {"error": "Nome de usuário/senha inválidos."}
. Caso contrário, o aplicativo 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 coincidem com os detalhes do Redis/MySQL, o aplicativo exibe a data/hora atual do sistema usando a declaração
{"time": current_time, ...}
. A entradaauthorized by
na saída permite ver o servidor de banco de dados que autentica os usuários no aplicativo.
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 ver se o mecanismo de cache do Redis funciona. Execute os comandos abaixo para testar o aplicativo:
-
Use o seguinte comando
python3
para executar o aplicativo: -
Assegure-se de que o servidor web personalizado do aplicativo esteja em execução:
-
Estabeleça outra conexão
SSH
para 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
. Acrescente[1-4]
ao final da URLhttp://localhost:8080/
para enviar as quatro solicitações em um único comando: -
Verifique as seguintes saídas. O servidor MySQL atende apenas ao primeiro pedido de autenticação. Em seguida, o banco de dados Redis atende aos três pedidos seguintes.
Sua lógica de aplicativo está agora funcionando conforme 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 Redis.