Servidor OAuth2 (Provedor de Identidade)
Este projeto conta com um servidor OAuth2 integrado (Identity Provider) baseado no django-oauth-toolkit. Isso permite que outras plataformas e aplicações externas efetuem login utilizando as contas e credenciais dos usuários da sua plataforma de comunidade multi-tenant.
🛠️ O que foi implementado
- Instalação do Provedor: Integração do pacote
django-oauth-toolkitcom suporte a fluxos seguros (como Authorization Code). - Endpoint de User Info (
/o/userinfo/): Endpoint REST compatível com o padrão OIDC, acessível via cabeçalho HTTPAuthorization: Bearer <token>, que retorna informações básicas do perfil do usuário logado:sub: Identificador único do usuário (UUID/ID).name: Nome de exibição público do usuário.email: Endereço de e-mail.email_verified: Status de confirmação do e-mail no sistema.username: Nome de usuário.
- Autenticação nos Endpoints DRF: Integração com a classe
OAuth2Authenticationdo Django REST Framework para proteger e validar tokens de acesso em quaisquer APIs do sistema. - Atalho de Criação Rápida no Makefile: Comando automatizado para gerar credenciais de aplicativos parceiros instantaneamente no banco de dados.
🚀 Como criar uma aplicação cliente (Outras plataformas)
Método 1: Pelo Terminal (Recomendado)
Use o comando adicionado ao Makefile no diretório raiz do projeto:
make create-oauth-app REDIRECT_URIS="https://minha-plataforma.com/callback" NAME="Minha Outra Plataforma"Parâmetros aceitos:
REDIRECT_URIS(obrigatório): A URL de retorno para onde o usuário será redirecionado após aceitar a autenticação.NAME(opcional): O nome amigável do app (ex:"Nextcloud","WordPress","Discourse"). O padrão é"External Platform".EMAIL(opcional): E-mail do usuário dono da aplicação. Caso omitido, associa ao primeiro administrador encontrado no sistema.
Saída esperada no terminal:
OAuth2 Application 'Minha Outra Plataforma' created successfully!
Owner: admin@tenant.com
Client ID: 8FjK9xYv72kLaPp...
Client Secret: pbkdf2_sha256$...
Redirect URIs: https://minha-plataforma.com/callback
Client Type: confidential
Grant Type: authorization-codeMétodo 2: Pelo Django Admin
- Acesse
http://localhost:8000/admin/(ou do seu subdomínio localhttp://tenant.localhost:8000/admin/). - Localize a seção Django OAuth Toolkit -> Applications e clique em Add Application.
- Defina os seguintes campos:
- Client Type:
Confidential(para servidores backend privados) ouPublic(para SPA/Apps Mobile). - Authorization Grant Type:
Authorization code(o mais seguro). - Redirect Uris: Cole a URL de callback da sua plataforma externa.
- Client Type:
- Salve e copie o Client ID e o Client Secret gerados.
🔗 URLs e Parâmetros de Integração
Ao configurar a sua outra plataforma (Nextcloud, WordPress, Discourse, etc.), insira as seguintes rotas da sua comunidade local ou de produção:
| Parâmetro / Endpoint | URL no Boilerplate | Descrição |
|---|---|---|
| Authorize URL | http://<domain>/o/authorize/ | Tela onde o usuário insere a senha e concede a permissão de acesso. |
| Token URL | http://<domain>/o/token/ | Endpoint backend-to-backend para trocar o código de autorização por um Access Token. |
| User Info URL | http://<domain>/o/userinfo/ | Endpoint para puxar os dados de perfil (Nome, E-mail, ID) usando o Token obtido. |
| Revoke URL | http://<domain>/o/revoke/ | (Opcional) Usado para invalidar o token atual. |
| Scopes | read (ou vazio) | Escopo de permissão de leitura dos dados básicos. |
Nota: Substitua <domain> pelo domínio principal ou pelo subdomínio correspondente à comunidade do inquilino (tenant) (ex: tenant.localhost:8000). O middleware resolve automaticamente a conta em cima do host acessado.
🔍 Formato do Endpoint /o/userinfo/
As outras plataformas receberão a seguinte payload em formato JSON ao consultarem o perfil do usuário:
{
"sub": "1",
"name": "João Silva",
"email": "joao.silva@exemplo.com",
"email_verified": true,
"username": "joaosilva"
}