Skip to content

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

  1. Instalação do Provedor: Integração do pacote django-oauth-toolkit com suporte a fluxos seguros (como Authorization Code).
  2. Endpoint de User Info (/o/userinfo/): Endpoint REST compatível com o padrão OIDC, acessível via cabeçalho HTTP Authorization: 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.
  3. Autenticação nos Endpoints DRF: Integração com a classe OAuth2Authentication do Django REST Framework para proteger e validar tokens de acesso em quaisquer APIs do sistema.
  4. 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:

bash
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:

text
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-code

Método 2: Pelo Django Admin

  1. Acesse http://localhost:8000/admin/ (ou do seu subdomínio local http://tenant.localhost:8000/admin/).
  2. Localize a seção Django OAuth Toolkit -> Applications e clique em Add Application.
  3. Defina os seguintes campos:
    • Client Type: Confidential (para servidores backend privados) ou Public (para SPA/Apps Mobile).
    • Authorization Grant Type: Authorization code (o mais seguro).
    • Redirect Uris: Cole a URL de callback da sua plataforma externa.
  4. 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 / EndpointURL no BoilerplateDescrição
Authorize URLhttp://<domain>/o/authorize/Tela onde o usuário insere a senha e concede a permissão de acesso.
Token URLhttp://<domain>/o/token/Endpoint backend-to-backend para trocar o código de autorização por um Access Token.
User Info URLhttp://<domain>/o/userinfo/Endpoint para puxar os dados de perfil (Nome, E-mail, ID) usando o Token obtido.
Revoke URLhttp://<domain>/o/revoke/(Opcional) Usado para invalidar o token atual.
Scopesread (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:

json
{
  "sub": "1",
  "name": "João Silva",
  "email": "joao.silva@exemplo.com",
  "email_verified": true,
  "username": "joaosilva"
}

Strum — Documentação.