Skip to content

Commit

Permalink
Alterando passlib para pwdlib no texto
Browse files Browse the repository at this point in the history
closes #154
  • Loading branch information
dunossauro committed Jun 1, 2024
1 parent fe351af commit 706833b
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 11 deletions.
20 changes: 10 additions & 10 deletions aulas/06.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Objetivos da Aula:
- Um entendimento básico sobre JWT
- Implementar autenticação de usuários com JWT.
- Adicionar lógica de autorização aos endpoints de atualização e deleção.
- Utilizar a biblioteca Bcrypt para encriptar as senhas dos usuários.
- Utilizar a biblioteca pwdlib para encriptar as senhas dos usuários.

??? tip "Caso prefira ver a aula em vídeo"
Esse aula ainda não está disponível em formato de vídeo, somente em texto!
Expand All @@ -31,7 +31,7 @@ Nesta aula, abordaremos dois aspectos cruciais de qualquer aplicação web: a au

A autenticação é o processo de verificar quem um usuário é, enquanto a autorização é o processo de verificar o que ele tem permissão para fazer. Usaremos o JSON Web Token (JWT) para implementar a autenticação, e adicionaremos lógica de autorização aos nossos endpoints.

Além disso, até agora, estamos armazenando as senhas dos usuários como texto puro no banco de dados, o que é uma prática insegura. Corrigiremos isso utilizando a biblioteca Bcrypt para encriptar as senhas.
Além disso, até agora, estamos armazenando as senhas dos usuários como texto puro no banco de dados, o que é uma prática insegura. Corrigiremos isso utilizando a biblioteca pwdlib para encriptar as senhas.

## O que é um JWT

Expand Down Expand Up @@ -105,10 +105,10 @@ Nos próximos tópicos, vamos detalhar como podemos gerar e verificar tokens JWT

## Gerando tokens JWT

Para gerar tokens JWT, precisamos de duas bibliotecas extras: `pyjwt` e `passlib`. A primeira será usada para a geração do token, enquanto a segunda será usada para criptografar as senhas dos usuários. Para instalá-las, execute o seguinte comando no terminal:
Para gerar tokens JWT, precisamos de duas bibliotecas extras: `pyjwt` e `pwdlib`. A primeira será usada para a geração do token, enquanto a segunda será usada para criptografar as senhas dos usuários. Para instalá-las, execute o seguinte comando no terminal:

```shell title="$ Execução no terminal!"
poetry add pyjwt "passlib[bcrypt]"
poetry add pyjwt "pwdlib[argon2]"
```

Agora, criaremos uma função para gerar nossos tokens JWT. Criaremos um novo arquivo para gerenciar a segurança: `security.py`. Nesse arquivo iniciaremos a geração dos tokens:
Expand All @@ -117,13 +117,13 @@ Agora, criaremos uma função para gerar nossos tokens JWT. Criaremos um novo ar
from datetime import datetime, timedelta

from jwt import encode
from passlib.context import CryptContext
from pwdlib import PasswordHash
from zoneinfo import ZoneInfo

SECRET_KEY = 'your-secret-key' # Isso é provisório, vamos ajustar!
ALGORITHM = 'HS256'
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=['bcrypt'], deprecated='auto')
pwd_context = PasswordHash.recommended()


def create_access_token(data: dict):
Expand Down Expand Up @@ -162,13 +162,13 @@ def test_jwt():
assert decoded['exp'] # Testa se o valor de exp foi adicionado ao token
```

Na próxima seção, veremos como podemos usar a biblioteca `passlib` para tratar as senhas dos usuários.
Na próxima seção, veremos como podemos usar a biblioteca `pwdlib` para tratar as senhas dos usuários.

## Hashing de Senhas

Armazenar senhas em texto puro é uma prática de segurança extremamente perigosa. Em vez disso, é uma prática padrão criptografar ("hash") as senhas antes de armazená-las. Quando um usuário tenta se autenticar, a senha inserida é criptografada novamente e comparada com a versão criptografada armazenada no banco de dados. Se as duas correspondem, o usuário é autenticado.

Implementaremos essa funcionalidade usando a biblioteca `passlib`. Criaremos duas funções: uma para criar o hash da senha e outra para verificar se uma senha inserida corresponde ao hash armazenado. Adicione o seguinte código ao arquivo `security.py`:
Implementaremos essa funcionalidade usando a biblioteca `pwdlib`. Criaremos duas funções: uma para criar o hash da senha e outra para verificar se uma senha inserida corresponde ao hash armazenado. Adicione o seguinte código ao arquivo `security.py`:

```python title="fast_zero/security.py" linenums="23"
def get_password_hash(password: str):
Expand All @@ -179,7 +179,7 @@ def verify_password(plain_password: str, hashed_password: str):
return pwd_context.verify(plain_password, hashed_password)
```

A função `get_password_hash` recebe uma senha em texto puro como argumento e retorna uma versão criptografada dessa senha. A função `verify_password` recebe uma senha em texto puro e uma senha criptografada como argumentos, e verifica se a senha em texto puro, quando criptografada, corresponde à senha criptografada. Ambas as funções utilizam o objeto `pwd_context`, que definimos anteriormente usando a biblioteca `passlib`.
A função `get_password_hash` recebe uma senha em texto puro como argumento e retorna uma versão criptografada dessa senha. A função `verify_password` recebe uma senha em texto puro e uma senha criptografada como argumentos, e verifica se a senha em texto puro, quando criptografada, corresponde à senha criptografada. Ambas as funções utilizam o objeto `pwd_context`, que definimos anteriormente usando a biblioteca `pwdlib`.

Agora, quando um usuário se registra em nossa aplicação, devemos usar a função `get_password_hash` para armazenar uma versão criptografada da senha. Quando um usuário tenta se autenticar, devemos usar a função `verify_password` para verificar se a senha inserida corresponde à senha armazenada.

Expand Down Expand Up @@ -485,7 +485,7 @@ from http import HTTPStatus
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jwt import DecodeError, decode, encode
from passlib.context import CryptContext
from pwdlib import PasswordHash
from sqlalchemy import select
from sqlalchemy.orm import Session

Expand Down
2 changes: 1 addition & 1 deletion aulas/08.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ from http import HTTPStatus
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jwt import DecodeError, ExpiredSignatureError, decode, encode
from passlib.context import CryptContext
from pwdlib import PasswordHash
from sqlalchemy import select
from sqlalchemy.orm import Session

Expand Down

0 comments on commit 706833b

Please sign in to comment.