Curso de FastAPI – Implementação de Autenticação e Autorização com tokens JWT | Aula 06

Posted by


Nesta aula, vamos aprender como implementar autenticação e autorização com tokens JWT (JSON Web Tokens) em FastAPI. Os tokens JWT são uma forma segura e eficiente de autenticar usuários em sua aplicação web.

Passo 1: Instalação do PyJWT

Para começar, é necessário instalar o pacote PyJWT, que é uma biblioteca Python para gerar, codificar e decodificar tokens JWT. Para instalar o PyJWT, execute o seguinte comando em seu terminal:

pip install PyJWT

Passo 2: Configuração do JWT Secret Key

Em seguida, você precisará definir uma chave secreta para assinar seus tokens JWT. Este segredo deve ser mantido em segredo e não deve ser compartilhado publicamente. Você pode definir a chave secreta em seu arquivo de configuração ou em uma variável de ambiente. Por exemplo:

JWT_SECRET = "minha_chave_secreta"

Passo 3: Implementação da Autenticação com Tokens JWT

Agora, vamos implementar a autenticação com tokens JWT em sua aplicação FastAPI. Primeiro, importe as bibliotecas necessárias:

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
from passlib.context import CryptContext

Em seguida, defina o contexto de criptografia para armazenar e verificar senhas criptografadas:

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

Defina as configurações JWT, incluindo o algoritmo de criptografia e o tempo de expiração do token:

JWT_ALGORITHM = "HS256"
JWT_EXPIRATION = 3600

Em seguida, crie funções auxiliares para gerar e verificar tokens JWT:

def create_access_token(data: dict):
    to_encode = data.copy()
    expires = datetime.utcnow() + timedelta(minutes=JWT_EXPIRATION)
    to_encode.update({"exp": expires})
    encoded_jwt = jwt.encode(to_encode, JWT_SECRET, algorithm=JWT_ALGORITHM)
    return encoded_jwt

def decode_access_token(token: str):
    try:
        payload = jwt.decode(token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
        return payload
    except JWTError:
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Invalid token")

Agora você pode criar rotas para login e verificação de token:

@app.post("/login")
def login(username: str, password: str):
    # Verifique se o usuário existe e a senha está correta
    # Se sim, crie e retorne um token de acesso
    return {"access_token": create_access_token({"sub": username})}

@app.get("/verify_token")
def verify_token(token: str = Depends(OAuth2PasswordBearer(tokenUrl="/login"))):
    payload = decode_access_token(token)
    return {"user": payload["sub"]}

Passo 4: Proteção de Rotas com Token JWT

Para proteger rotas específicas que requerem autenticação, você pode usar o decorador Depends com a classe OAuth2PasswordBearer. Por exemplo:

@app.get("/protected_route")
def protected_route(current_user: str = Depends(OAuth2PasswordBearer(tokenUrl="/login"))):
    return {"message": "This is a protected route", "user": current_user}

Ao acessar a rota /protected_route, o usuário será obrigado a fornecer um token JWT válido no cabeçalho Authorization.

Espero que este tutorial tenha sido útil para aprender a implementar autenticação e autorização com tokens JWT em FastAPI. Boa sorte em seus projetos!

0 0 votes
Article Rating
11 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@yagodde
30 days ago

essa playlist deveria ganhar o Emmy das séries. Dei uma boiada de leve no final da aula 5, mas dei uma revisitada nela em 2x e ta sussa agora

@PauloVitor-ox9tk
30 days ago

Aula muito boa!!! Valeu Duno!

@marciorodriguesmota7927
30 days ago

Excelente aula!!

@aylton_21
30 days ago

Aonde fica armazenado o toke ?

@fravibis
30 days ago

Valeu!

@Pedro_Nora
30 days ago

Outra aula sensacional!

@dietrichmontcho1917
30 days ago

Eu estou disposto a pagar só para vc me ensinar

@dietrichmontcho1917
30 days ago

Se puder ensinar como fazer o deploy ficarei agradecido.

@dietrichmontcho1917
30 days ago

Ficou muito bom

@MarcosViana
30 days ago

o meu deu problema na hora de gerar o JWT: ZoneInfoNotFoundError: 'No time zone found with key UTC'
Solução: pip install tzdata

@gabriellustosa9549
30 days ago

finalmente entendi, valeu!