Projeto de integração backend com HubSpot utilizando Spring Boot, desenvolvido para um case técnico de entrevista. O objetivo é demonstrar domínio em OAuth 2.0, integração com APIs externas, boas práticas de código, segurança e clareza na documentação.
Esta aplicação expõe uma API REST para:
- Autenticação OAuth 2.0 com o HubSpot (Authorization Code Flow)
- Criação e listagem de contatos no CRM do HubSpot
- Recebimento de notificações via Webhook
O projeto foi estruturado para ser didático, seguro e facilmente extensível para produção.
- Separação clara de responsabilidades (Controller, Service, Model)
- Tratamento robusto de erros e mensagens amigáveis
- Código limpo e comentado
- Exemplos práticos de uso (Postman/cURL)
- Pronto para deploy em cloud (basta configurar variáveis de ambiente)
- README completo e didático
- Fluxo OAuth automatizado: login com redirecionamento automático, sem necessidade de copiar/colar URLs
- Java 17+
- Maven 3.8+
- Edite o arquivo
src/main/resources/application.propertiescom as credenciais do seu app HubSpot:hubspot.client-id=SEU_CLIENT_ID hubspot.client-secret=SEU_CLIENT_SECRET hubspot.redirect-uri=http://localhost:8080/oauth/callback
- No painel do app HubSpot, cadastre exatamente a URL de redirecionamento acima.
./mvnw spring-boot:run-
Inicie a aplicação
- Execute
./mvnw spring-boot:runna raiz do projeto.
- Execute
-
Inicie o login OAuth de forma automática
- Acesse
http://localhost:8080/oauth/loginno navegador. - Você será redirecionado automaticamente para o HubSpot para autorizar o app.
- Acesse
-
Autorize o app no HubSpot
- Faça login e autorize o app.
- Você será redirecionado para
http://localhost:8080/oauth/callback?code=...e verá uma mensagem de sucesso.
-
Teste a criação de contatos
- No Postman, importe a coleção
postman/hubspot.postman_collection.json. - Selecione a requisição
POST http://localhost:8080/contacts. - No body, envie:
{ "firstName": "João", "lastName": "Silva", "email": "[email protected]" } - Clique em Send. Você verá a resposta com os dados do contato criado.
- No Postman, importe a coleção
-
Teste a listagem de contatos
- No Postman, selecione a requisição
GET http://localhost:8080/contacts. - Clique em Send. Você verá a lista de contatos cadastrados no HubSpot.
- No Postman, selecione a requisição
- Inicie a aplicação
- Acesse
/oauth/login- Você será redirecionado automaticamente para autorizar o app no HubSpot
- Autorize o app no HubSpot
- Você será redirecionado para
/oauth/callback?code=... - O token será salvo em memória
- Você será redirecionado para
- Crie contatos via
/contacts(POST) - Liste contatos via
/contacts(GET) - Receba webhooks em
/webhook/contact-creation
- GET
/oauth/login - Descrição: Redireciona automaticamente o usuário para a tela de autorização do HubSpot, facilitando o início do fluxo OAuth.
- GET
/oauth/authorize-url - Descrição: Retorna a URL para iniciar o fluxo OAuth no HubSpot (útil para testes manuais ou integração com frontend).
- Exemplo de resposta:
https://app.hubspot.com/oauth/authorize?client_id=...&redirect_uri=...&scope=...
- GET
/oauth/callback?code=... - Descrição: Recebe o código do HubSpot, troca pelo token e armazena em memória.
- Resposta de sucesso:
Autenticação realizada com sucesso! Token: {"access_token":"...", ...}
- POST
/contacts - Descrição: Cria um contato no HubSpot.
- Body (JSON):
{ "firstName": "João", "lastName": "Silva", "email": "[email protected]" } - Exemplo cURL:
curl -X POST http://localhost:8080/contacts \ -H "Content-Type: application/json" \ -d '{"firstName":"João","lastName":"Silva","email":"[email protected]"}'
- Exemplo de resposta:
{ "id": "117480891295", "properties": { "firstname": "João", "lastname": "Silva", "email": "[email protected]", ... } }
- GET
/contacts - Descrição: Lista todos os contatos do HubSpot.
- Exemplo cURL:
curl http://localhost:8080/contacts
- Exemplo de resposta:
{ "results": [ { "id": "...", "properties": { ... } }, ... ] }
- POST
/webhook/contact-creation - Descrição: Endpoint para receber notificações de criação de contatos do HubSpot (webhook).
- Body: Recebe o payload enviado pelo HubSpot.
- Importe a coleção
postman/hubspot.postman_collection.jsonno Postman. - Teste os endpoints de criação e listagem de contatos facilmente.
- Edite os bodies conforme necessário para outros testes.
- 401 Unauthorized ao criar contato:
- Refazer o fluxo OAuth (token pode ter expirado)
- Verifique se o backend está salvando apenas o
access_tokendo JSON
- Erro de redirect URI:
- Verifique se a URL cadastrada no HubSpot é idêntica à do
application.properties
- Verifique se a URL cadastrada no HubSpot é idêntica à do
- Conta não tem acesso aos escopos:
- Use uma conta de desenvolvedor ou ajuste os escopos do app
- Armazenar tokens de forma segura (ex: banco de dados ou serviço de secrets)
- Implementar refresh automático do token OAuth
- Adicionar autenticação/autorização nos endpoints da API
- Validar assinatura dos webhooks do HubSpot
- Adicionar testes automatizados (unitários e integração)
- Deploy em cloud (Heroku, AWS, GCP, etc)
controller/- Endpoints RESTservice/- Lógica de negócio e integração com HubSpotmodel/- DTOs e entidadesconfig/- Configuraçõespostman/- Coleção de testes para Postman
Dúvidas, sugestões ou feedback? Fique à vontade para entrar em contato!