Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions .github/workflows/invent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,18 @@ jobs:
strategy:
max-parallel: 4
matrix:
python-version: [3.10.12 , 3.11.4]
python-version: ["3.10", "3.11", "3.12", "3.13"]
resolution: [highest]
include:
# Versões mínimas declaradas no pyproject (Django 4.2, Authlib 1.3.1).
- python-version: "3.10"
resolution: lowest-direct

steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
- uses: actions/checkout@v4
- name: Set up uv
uses: astral-sh/setup-uv@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install tox
- name: Run Tests
run: |
tox
run: uv run --isolated --resolution ${{ matrix.resolution }} python manage.py test
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ dist
.venv
.coverage
.tox
bin
bin
build
58 changes: 54 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,34 @@ a dificuldade de alteração do model User depois de realizada a primeira migrat
python manage.py migrate
```

6. Adicione rotas para as views accounts_login e accounts_authorize::
6. Inclua as rotas do pacote (login, authorize, user e logout, no namespace `accounts`)::

```
urlpatterns = [
path('login', accounts_login, name='login'),
path('authorize', accounts_authorize, name='authorize'),
path('auth/', include('django_oauth_usp.accounts.urls')),
]
```

`REDIRECT_URI` deve apontar para a rota `authorize` (no exemplo, `/auth/authorize`).
Opcionalmente, defina `REDIRECT_AFTER_LOGOUT_URL` (padrão: `/`).

## Login e logout

* Quem não tem vínculo com uma unidade de `ALLOWED_UNIDADES` recebe 403 já no
retorno da Senha Única: o usuário não é gravado nem logado. Superusuários já
cadastrados são liberados. O `OAuthUspMiddleware` continua barrando quem já
estava logado, por exemplo depois de uma mudança na lista.
* O parâmetro `next` do login (`/auth/login?next=/pagina`) só é aceito para
endereços do próprio site; qualquer outro é trocado por `/`.
* O logout só aceita POST com o token CSRF:

```
<form method="post" action="{% url 'accounts:logout' %}">
{% csrf_token %}
<button type="submit">Sair</button>
</form>
```

## Dados do usuário

Os model UserModel provê os seguintes dados do usuário
Expand Down Expand Up @@ -103,4 +123,34 @@ user.get_vinculo()
* Setor
```
user.get_setor()
```
```

## Atualizando da versão 1.x

A versão 2.0.0 corrige falhas de segurança e muda alguns comportamentos:

* **Logout só por POST.** Troque links `<a href="{% url 'accounts:logout' %}">` por um formulário (veja acima).
* **Sem senha para usuários do OAuth.** Antes, o `wsuserid` era gravado como senha, o que
permitia entrar por formulários de senha (como o do admin). A migration `0002` torna
essas senhas inutilizáveis; senhas criadas com `createsuperuser` são mantidas.
O `migrate` calcula um hash por usuário, então pode levar alguns segundos em bases grandes.
* **O login não sobrescreve mais `is_staff`, `is_superuser`, `is_active` e `date_joined`.**
Usuários desativados no admin continuam bloqueados (recebem 403 no login).
* **`ALLOWED_UNIDADES` compara os códigos exatos.** Antes, a unidade 1 era aceita quando
14 estava na lista. O middleware libera superusuários e o logout.
* **Quem não é das unidades permitidas não entra.** Antes, o login era concluído, o
usuário era gravado e só o middleware respondia 403 nas páginas seguintes, sem
deixar a pessoa sair. Agora o `authorize` responde 403 sem gravar nem logar.
* **O vínculo é gravado em JSON.** Registros antigos continuam sendo lidos. O método
`prepare_json_string` foi removido.
* Erros no retorno do OAuth (login recusado, token expirado) respondem 400 em vez de 500.

## Desenvolvimento

O projeto usa o [uv](https://docs.astral.sh/uv/):

```
uv sync
uv run python manage.py test
uv build
```
Empty file.
Empty file.
14 changes: 0 additions & 14 deletions build/lib/django_oauth_usp/accounts/admin.py

This file was deleted.

5 changes: 0 additions & 5 deletions build/lib/django_oauth_usp/accounts/apps.py

This file was deleted.

77 changes: 0 additions & 77 deletions build/lib/django_oauth_usp/accounts/managers.py

This file was deleted.

20 changes: 0 additions & 20 deletions build/lib/django_oauth_usp/accounts/middleware.py

This file was deleted.

42 changes: 0 additions & 42 deletions build/lib/django_oauth_usp/accounts/migrations/0001_initial.py

This file was deleted.

Empty file.
69 changes: 0 additions & 69 deletions build/lib/django_oauth_usp/accounts/models.py

This file was deleted.

43 changes: 0 additions & 43 deletions build/lib/django_oauth_usp/accounts/oauth.py

This file was deleted.

Empty file.
Loading
Loading