Aplicação web desenvolvida em Django que demonstra o fluxo completo de autenticação OAuth 2.0 utilizando o GitHub como provedor. Ao fazer login, o usuário é redirecionado para o GitHub, autoriza o acesso e retorna autenticado para a plataforma, sem a necessidade de cadastro manual ou senha.
O projeto simula uma plataforma de curadoria de notícias tech chamada BytePress. Ele serve como estudo prático do protocolo OAuth 2.0, usando a biblioteca django-allauth para gerenciar todo o fluxo de autenticação social.
Fluxo de autenticação:
Usuário → Clica em "Continuar com GitHub"
→ Redirecionado para github.com/login/oauth/authorize
→ Autoriza o app no GitHub
→ GitHub redireciona para /accounts/github/login/callback/
→ django-allauth valida o code + state
→ Sessão criada → Usuário na Home
| Tecnologia | Versão | Uso |
|---|---|---|
| Python | 3.x | Linguagem base |
| Django | 6.0.5 | Framework web |
| django-allauth | 65.17.0 | OAuth 2.0 / Social Auth |
| SQLite | — | Banco de dados |
| python-decouple | 3.8 | Variáveis de ambiente |
| HTML/CSS | — | Interface (dark theme) |
- Login via GitHub OAuth 2.0 (sem senha)
- Proteção de rotas com
@login_required - Logout com redirecionamento para a tela inicial
- Dropdown de usuário na navbar
- Interface responsiva com tema escuro
- Feed de notícias tech (layout de demonstração)
- Python 3.10+
- Conta no GitHub para criar o OAuth App
- Git
Antes de rodar o projeto, você precisa registrar um OAuth App no GitHub:
- Acesse github.com/settings/developers
- Clique em New OAuth App
- Preencha os campos:
| Campo | Valor |
|---|---|
| Application name | BytePress (ou qualquer nome) |
| Homepage URL | http://localhost:8000 |
| Authorization callback URL | http://localhost:8000/accounts/github/login/callback/ |
- Clique em Register application
- Copie o Client ID e gere um Client Secret
git clone https://github.com/seu-usuario/oauth2.0.git
cd oauth2.0python -m venv venv
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activatepip install -r requirements.txtCopie o arquivo de exemplo e preencha com suas credenciais:
cp .env.example .envEdite o .env:
SECRET_KEY=sua-secret-key-django-aqui
CLIENT_ID=seu-github-client-id
SECRET=seu-github-client-secretPara gerar uma SECRET_KEY segura:
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"python manage.py migratepython manage.py runserverAcesse: http://localhost:8000
oauth2.0/
├── setup/ # Configurações do projeto Django
│ ├── settings.py # Configurações principais
│ ├── urls.py # Roteamento raiz
│ ├── wsgi.py
│ └── asgi.py
├── tech/ # App principal
│ ├── views.py # Views: index (login) e home (protegida)
│ ├── urls.py # Rotas da app
│ ├── models.py
│ └── apps.py
├── templates/ # Templates HTML
│ ├── index.html # Tela de login
│ ├── home.html # Tela principal (pós-login)
│ └── static/
│ ├── login.css
│ └── home.css
├── .env # Variáveis de ambiente (não versionado)
├── .env.example # Exemplo de variáveis necessárias
├── .gitignore
├── manage.py
└── requirements.txt
| Rota | View | Descrição |
|---|---|---|
/ |
index |
Tela de login |
/home |
home |
Feed principal (requer login) |
/accounts/github/login/ |
allauth | Inicia o fluxo OAuth |
/accounts/github/login/callback/ |
allauth | Callback do GitHub |
/accounts/logout/ |
allauth | Logout |
/admin/ |
Django Admin | Painel administrativo |
| Variável | Descrição |
|---|---|
SECRET_KEY |
Chave secreta do Django |
CLIENT_ID |
Client ID do GitHub OAuth App |
SECRET |
Client Secret do GitHub OAuth App |
# Redireciona para /home após login bem-sucedido
LOGIN_REDIRECT_URL = '/home'
# Redireciona para / após logout
LOGOUT_REDIRECT_URL = '/'
# Permite iniciar o fluxo OAuth via GET (sem formulário intermediário)
SOCIALACCOUNT_LOGIN_ON_GET = True
# Permite logout direto via GET
ACCOUNT_LOGOUT_ON_GET = True
# Necessário para o callback OAuth funcionar corretamente (cross-site redirect)
SESSION_COOKIE_SAMESITE = 'Lax'Erro "Falha no login de terceiros" após logout
Causado por SESSION_COOKIE_SAMESITE restritivo. Já corrigido nas configurações com 'Lax'. Caso persista, limpe os cookies do browser e tente novamente.
- O arquivo
.envestá listado no.gitignoree nunca deve ser commitado - Em produção, configure
DEBUG = FalseeALLOWED_HOSTScom o domínio real - A
SECRET_KEYdeve ser única por ambiente (desenvolvimento, produção) - Revogue e regenere o Client Secret do GitHub se ele for exposto
Desenvolvido por @odevhenrique