API RESTful completa para autenticação e gerenciamento de usuários, construída com Node.js, Express e PostgreSQL (otimizada para Neon). Inclui JWT para autenticação (Access + Refresh Tokens), hashing de senhas com bcrypt, validação de entrada, rate limiting, CORS, headers de segurança com Helmet, suporte básico a papéis (Roles) e registro controlado por código de convite ou criação direta por admin.
- Autenticação Baseada em JWT:
- Tokens de Acesso (Access Tokens) de curta duração.
- Tokens de Atualização (Refresh Tokens) de longa duração com invalidação via blacklist (
/logout). - Geração de tokens segura com segredos distintos.
- Endpoint para obter um novo Access Token usando o Refresh Token (
/refresh).
- Gerenciamento de Usuário Controlado:
- Registro Público via Convite: Novos usuários só podem se registrar fornecendo um código de convite (
inviteCode) válido e não utilizado (/register). - Geração de Convites por Admin: Endpoint para administradores gerarem códigos de convite únicos (
/admin/invite-codes). - Criação Direta por Admin: Endpoint para administradores criarem contas de usuário diretamente, podendo definir o papel (
/admin/users). - Endpoint protegido de exemplo para buscar perfil do usuário logado (
/profile).
- Registro Público via Convite: Novos usuários só podem se registrar fornecendo um código de convite (
- Segurança:
- Hashing de senhas com
bcrypt. - Validação de dados de entrada com
express-validator. - Rate Limiting com
express-rate-limitpara prevenir força bruta. - Headers de segurança HTTP configurados com
helmet. - Configuração de CORS (
cors) para permitir acesso controlado do frontend. - JWT ID (
jti) em Refresh Tokens para permitir invalidação individual.
- Hashing de senhas com
- Papéis (Roles):
- Estrutura básica para papéis de usuário (ex: 'user', 'admin', 'moderator').
- Middleware
verifyRolespara proteger rotas baseadas em papéis. - Mecanismo seguro para criação de usuário Admin inicial via script (
npm run seed:admin).
- Documentação:
- Documentação interativa da API gerada via
apiDocJSe disponível em/docs.
- Documentação interativa da API gerada via
- Backend: Node.js
- Framework: Express.js
- Banco de Dados: PostgreSQL (configurado para Neon.tech, mas adaptável)
- Autenticação: JSON Web Tokens (
jsonwebtoken),bcrypt - Validação:
express-validator - Segurança:
helmet,cors,express-rate-limit - Geração de ID/Códigos:
uuid,crypto(Node.js built-in) - Driver DB:
pg(node-postgres) - Variáveis de Ambiente:
dotenv(para desenvolvimento local) - Documentação:
apidoc
- Node.js (Versão LTS recomendada, definida em
package.json->engines) - npm (geralmente vem com Node.js)
- Git (para clonar o repositório)
- Acesso a um servidor PostgreSQL (Ex: Conta gratuita no Neon.tech)
-
Clone o Repositório:
git clone <URL_DO_SEU_REPOSITORIO> cd <NOME_DA_PASTA_DO_PROJETO>
-
Instale as Dependências:
npm install
-
Configure as Variáveis de Ambiente:
- Copie o arquivo
.env.examplepara um novo arquivo chamado.env. - Edite o arquivo
.enve preencha TODAS as variáveis com seus próprios valores (veja.env.examplepara a lista completa e descrições). Preste atenção especial a:JWT_SECRETeJWT_REFRESH_SECRET(devem ser fortes, únicos e diferentes entre si).DATABASE_URL(URL de conexão completa do seu PostgreSQL).CORS_ALLOWED_ORIGINS(URLs do seu frontend).ADMIN_USERNAMEeADMIN_PASSWORD(credenciais para o script de criação do admin inicial).
- Copie o arquivo
-
Configure o Banco de Dados:
-
Conecte-se ao seu banco de dados PostgreSQL.
-
Execute os seguintes comandos SQL na ordem correta para criar as tabelas e índices necessários:
-- 1. Cria a tabela de usuários CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(255) UNIQUE NOT NULL, "passwordHash" TEXT NOT NULL, "createdAt" TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL ); -- 2. Adiciona a coluna 'role' à tabela 'users' (se ainda não existir) ALTER TABLE users ADD COLUMN IF NOT EXISTS "role" VARCHAR(50) NOT NULL DEFAULT 'user'; -- 3. Cria a tabela de códigos de convite CREATE TABLE IF NOT EXISTS invite_codes ( id SERIAL PRIMARY KEY, code VARCHAR(64) UNIQUE NOT NULL, is_used BOOLEAN DEFAULT false NOT NULL, created_by INTEGER REFERENCES users(id) ON DELETE SET NULL, used_by INTEGER REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP NOT NULL, used_at TIMESTAMPTZ NULL ); -- 4. Cria índices (se ainda não existirem) CREATE INDEX IF NOT EXISTS idx_users_username ON users(username); CREATE INDEX IF NOT EXISTS idx_invite_codes_code ON invite_codes(code);
-
Nota: O uso de
IF NOT EXISTStorna os comandos seguros para serem executados múltiplas vezes, mas a ordem ainda é importante para as referências (REFERENCES users(id)).
-
-
Crie o Usuário Admin Inicial:
- Certifique-se que
ADMIN_USERNAMEeADMIN_PASSWORDestão definidos no seu arquivo.env. - Execute o script para criar o usuário admin no banco:
npm run seed:admin
- Este comando só precisa ser executado uma vez (ele verifica se o admin já existe).
- Certifique-se que
-
Gere a Documentação Inicial:
npm run docs
(Você precisará rodar isso novamente se modificar os comentários
@apinas rotas).
-
Desenvolvimento Local (com Nodemon para auto-reload):
npm run dev
A API estará disponível em
http://localhost:PORTe a documentação emhttp://localhost:PORT/docs. -
Produção:
npm start
Lembre-se que o script
startagora também executa oseed:admin(de forma segura) antes de iniciar o servidor. Use um gerenciador de processos como PM2 em ambientes de produção reais fora de plataformas como Render.
Uma visão geral. Para detalhes completos, parâmetros e respostas, acesse a documentação em /docs.
GET /: Verifica se a API está online.
Autenticação (/api/auth)
POST /register: Registra um novo usuário usando uminviteCodeválido.POST /login: Autentica um usuário e retorna Access/Refresh tokens.POST /refresh: Obtém um novo Access Token usando um Refresh Token válido.POST /logout: Invalida o Refresh Token fornecido (adiciona à blacklist).
Usuário (/api/auth)
GET /profile: (Protegido) Retorna informações do usuário logado.
Administração (/api/admin) - Requer Role 'admin'
POST /invite-codes: Gera um ou mais códigos de convite.POST /users: Cria um novo usuário diretamente (pode definir role).GET /admin-only: (Protegido - Role 'admin') Exemplo de rota restrita a admins.GET /staff-area: (Protegido - Role 'admin' ou 'moderator') Exemplo de rota restrita a múltiplos papéis.
Documentação Interativa (apiDoc):
Após iniciar a API, acesse: http://localhost:PORT/docs
- Use ferramentas como Postman, Insomnia ou
curl. - Fluxo de Registro:
- Faça login como admin.
- Use o token do admin para chamar
POST /api/admin/invite-codese obter um código. - Chame
POST /api/auth/registercomusername,passworde oinviteCodeobtido.
- Fluxo Admin Create:
- Faça login como admin.
- Use o token do admin para chamar
POST /api/admin/userscomusername,passworde (opcionalmente)roleno corpo.
- Lembre-se de incluir o
Content-Type: application/jsonparaPOSTe o headerAuthorization: Bearer <seu_access_token>para rotas protegidas.
- Faça o commit do seu código para um repositório Git (GitHub, GitLab). NÃO inclua o arquivo
.envno commit. - Crie um "Web Service" no Render e conecte-o ao seu repositório.
- Configurações no Render:
- Build Command:
npm install && npm run docs(Instala dependências E gera a documentação estática). - Start Command:
npm start(Executaráseed:admine depoisnode server.js). - Environment Variables: Configure TODAS as variáveis de ambiente necessárias (listadas na seção de configuração
.env) diretamente no painel do Render. Use valores fortes e únicos para os segredos JWT e credenciais de admin! - Publish Directory (se aplicável): Se o Render perguntar por um diretório de publicação (para sites estáticos, não comum para web services Node, mas caso use), aponte para
publicou deixe em branco. Oexpress.staticcuidará de servir/docs.
- Build Command:
- O Render fará o build e deploy automaticamente.
Contribuições são bem-vindas (se aplicável). Por favor, siga as boas práticas de desenvolvimento.
Este projeto está licenciado sob a Licença ISC.
Atualizado por Marquin - Engenheiro de Software Sênior - ${new Date().toLocaleDateString('pt-BR')}