Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

trust me #4

Open
wants to merge 14 commits into
base: feature/user_changes
Choose a base branch
from
5 changes: 5 additions & 0 deletions src/auth/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .auth import router as auth_router

__all__ = [
"auth_router",
]
83 changes: 83 additions & 0 deletions src/auth/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import jwt
from fastapi import FastAPI, Depends, HTTPException, Request, APIRouter, status

from datetime import datetime, timedelta, timezone
from typing import Annotated
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from src.repository.usuario_repository import UsuarioRepository
from src.models.usuario import Usuario
from src.schemes.token import Token, TokenData
import dotenv
import os

# Autenticação com base em JWT

router = APIRouter()
dotenv.load_dotenv()

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# Localizacao da chave privada
# PRIVATE_KEY_LOC = os.getenv("PRIVATE_KEY_LOC")

# Token expira em 60 minutos
ACCESS_TOKEN_EXPIRE_MINUTES = 60

PRIVATE_KEY = "2b859242a14dfe1bb48379ebdfb746a2a696932280ba34565454841f986a470e"

# Autentica o usuário
def authenticate_user(email: str):
usuario_repository = UsuarioRepository()
user = usuario_repository.get_by_email(email)
if not user:
return False
return user

# Cria o token de accesso
def create_access_token(data: dict, expires_delta: timedelta | None = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, PRIVATE_KEY, algorithm="HS256")
return encoded_jwt

# Rota para autenticar o usuário
@router.post("/token")
async def login(
form_data: Annotated[TokenData, Depends()],
) -> Token:
user = authenticate_user(form_data.email)
if not user:
usuario_repository = UsuarioRepository()
usuario_data = Usuario(email=form_data.email, nome=form_data.email)
usuario_repository.create(usuario_data)

access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(data={"email": form_data.email}, expires_delta=access_token_expires)
return Token(access_token=access_token, token_type="bearer")

# Rota para pegar o usuário atual (logado)
@router.get("/usuario", response_model=Usuario)
async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code = status.HTTP_401_UNAUTHORIZED,
detail = "Credenciais inválidas",
headers = {"WWW-Authenticate": "Bearer"}
)
try:
payload = jwt.decode(token, PRIVATE_KEY, algorithms=["HS256"])
email = payload.get("email")
if email is None:
raise credentials_exception
token_data = TokenData(email=email)

except jwt.PyJWTError:
raise credentials_exception

usuario_repository = UsuarioRepository()
user = usuario_repository.get_by_email(email=token_data.email)
if user is None:
raise credentials_exception
return user
25 changes: 25 additions & 0 deletions src/auth/auth_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# import jwt
# import dotenv
# import os
# from datetime import datetime, timedelta

# dotenv.load_dotenv()

# # print the actual path of the folder


# with open("jwtRS256.key") as file:
# SECRET_KEY = file.read()

# ALGORITHM = "RS256"

# # Create a payload with username and email
# payload = {
# "username": "edsaibert",
# "email": "[email protected]",
# "exp": datetime.utcnow() + timedelta(minutes=30) # Token expires in 30 minutes
# }

# # Generate the token
# token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
# print(token)
1 change: 1 addition & 0 deletions src/auth/secret.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2b859242a14dfe1bb48379ebdfb746a2a696932280ba34565454841f986a470e
24 changes: 20 additions & 4 deletions src/controller/pagina_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from fastapi import APIRouter, status
from typing import Optional, List
from src.repository.pagina_repository import PaginaRepository
from src.schemes.pagina import PaginaOut
from src.schemes.pagina import PaginaOut, PaginaRequest

router = APIRouter()
pagina_repository = PaginaRepository()
Expand All @@ -12,9 +12,25 @@
async def get_pagina() -> PaginaOut:
return pagina_repository.get_all()

@router.get("/pagina_unica", response_model=Optional[PaginaOut], status_code=status.HTTP_200_OK)
async def get_pagina_unica() -> PaginaOut:
return pagina_repository.get_pagina_unica()
@router.get("/pagina_unica/{usuario_id}/{lingua}", status_code=status.HTTP_200_OK)
async def get_pagina_unica(usuario_id: int, lingua: str) -> PaginaOut:
data_out, last_page = pagina_repository.get_pagina_unica(usuario_id, lingua)

dataout = PaginaOut(
id=data_out.id,
exemplar_id=data_out.exemplar_id,
pagina_index=data_out.pagina_index,
image_path=data_out.image_path,
iiif_path=data_out.iiif_path,
fontes=data_out.fontes,
lingua=data_out.lingua,
last_page=last_page
)

return dataout




@router.get("/{id}", response_model=Optional[PaginaOut], status_code=status.HTTP_200_OK)
async def get_pagina(id: int) -> PaginaOut:
Expand Down
Loading