Skip to content

Commit

Permalink
Adiciona notas na função get_current_user na aula 06 para facilitar…
Browse files Browse the repository at this point in the history
… o entendimento

closes #196
  • Loading branch information
dunossauro committed Sep 7, 2024
1 parent 7f8c40a commit 1e56110
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions aulas/06.md
Original file line number Diff line number Diff line change
Expand Up @@ -512,9 +512,9 @@ oauth2_scheme = OAuth2PasswordBearer(tokenUrl='token')

def get_current_user(
session: Session = Depends(get_session),
token: str = Depends(oauth2_scheme),
token: str = Depends(oauth2_scheme), #(1)!
):
credentials_exception = HTTPException(
credentials_exception = HTTPException( #(2)!
status_code=HTTPStatus.UNAUTHORIZED,
detail='Could not validate credentials',
headers={'WWW-Authenticate': 'Bearer'},
Expand All @@ -524,21 +524,27 @@ def get_current_user(
payload = decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get('sub')
if not username:
raise credentials_exception
raise credentials_exception #(3)!
token_data = TokenData(username=username)
except DecodeError:
raise credentials_exception
raise credentials_exception #(4)!

user = session.scalar(
select(User).where(User.email == token_data.username)
)

if not user:
raise credentials_exception
raise credentials_exception #(5)!

return user
```

1. A injeção de `oauth2_scheme` garante que um token foi enviado, caso não tenha sido enviado ele redirecionará a `tokenUrl` do objeto `OAuth2PasswordBearer`.
2. Como essa operação pode apresentar erros em diversos momentos, foi atribuído um único erro a variável `credentials_exception`.
3. Nessa primeira validação é checado se após o decode do token a chave `username` está presente. Caso não esteja, o erro será levantado.
4. Nessa validação é testada se o token é um token JWT válido. Caso não seja, o erro também será levantado.
5. Nossa última validação checa, após de garantir que existe `username`, se ele está presente em nossa base de dados. Caso não, o erro será levantado.

Aqui, a função `get_current_user` é definida como assíncrona, indicando que ela pode realizar operações de IO (como consultar um banco de dados) de forma não bloqueante. Esta função aceita dois argumentos: `session` e `token`. O `session` é obtido através da função `get_session` (não mostrada aqui), que deve retornar uma sessão de banco de dados ativa. O `token` é obtido do header de autorização da requisição, que é esperado ser do tipo Bearer (indicado pelo esquema OAuth2).

A variável `credentials_exception` é definida como uma exceção HTTP que será lançada sempre que houver um problema com as credenciais fornecidas pelo usuário. O status 401 indica que a autenticação falhou e a mensagem "Could not validate credentials" é retornada ao cliente. Além disso, um cabeçalho 'WWW-Authenticate' é incluído na resposta, indicando que o cliente deve fornecer autenticação.
Expand Down Expand Up @@ -726,7 +732,7 @@ tests/test_security.py::test_jwt_invalid_token PASSED

1. Faça um teste para cobrir o cenário que levanta exception `credentials_exception` na autenticação caso o `User` não seja encontrado. Ao olhar a cobertura de `security.py` você vai notar que esse contexto não está coberto.

2. Reveja os testes criados até a aula 5 e veja se eles ainda fazem sentido (testes envolvendo 400)
2. Reveja os testes criados até a aula 5 e veja se eles ainda fazem sentido (testes envolvendo `#!python 400`)

## Commit

Expand Down

0 comments on commit 1e56110

Please sign in to comment.