Executando verificação de segurança...
9

Pitch: Como resolvi um problema e transformei em um produto!

Fala pessoal, tudo certo?

Faz um tempo que não venho compartilhar com vocês, este mês foi particularmente corrido, mas estamos na ativa. Hoje, estamos lançando um novo produto no ProductHunt e adoraria o suporte de vocês.

Mas, antes de mais nada, deixe eu apresentar para vocês:

Nesta jornada de criar um MicroSaaS por mês, estamos criando tudo com programação, ou seja, a boa e velha mão no código. Entretanto, na nossa stack atual que se baseia no framework NextJS, tinhamos uma deficiência, não conseguiamos agendar tarefas para serem executadas em uma data agendada ou até mesmo, ter um controle de retentativas caso algo desse errado.

Pensando nisso, criamos o NextCron, uma solução para gestão de jobs assincronos. Ela serve para qualquer linguagem, provavelmente até no Bubble. Nós criamos uma interface simples e tudo pode ser trabalhado com uma única rota na API.

Uma ferramenta mais focada para desenvolvedores e que está resolvendo uma dor enorme para nós e certamente, pode resolver o problema de outras pessoas.

Nossa precificação é simples, ilimitados membros no time e cobramos apenas pelos eventos enviado, sendo que no plano free existem 1000 jobs gratuitos.

Estamos levando o Build In Public bem a sério, então temos uma aba separada apenas para os números em tempo real da plataforma, quantidade de usuários, quantidade de times e etc. Vamos adicionar mais números em breve.

Enfim, convido vocês a testarem e claro, darem um suporte no ProductHunt:
https://www.producthunt.com/posts/nextcron

Estou compartilhando a jornada no Instagram:
https://www.instagram.com/vibe.dev/

Carregando publicação patrocinada...
4

Parabéns pelo projeto Felipe, ele está muito bonito!

Uma dúvida, pois não consegui encontrar na documentação: vi pelas telas que você define um target com uma URL a ser chamada. Há alguma forma de enviar alguma credencial junto para ter certeza de que, quem está chamando isto, é de fato o cron?

O Next vai suportar cron também de forma oficial como publicado aqui, porém na documentação eles destacam a pergunta How to secure cron jobs? e a técnica é enviar por query parameter uma chave, por exemplo /api/cron?key=sharedKey, mas isto é péssimo porque nesse caso é preciso fazer o commit desta chave no repositório (e no nosso caso que o repositório é público, pior ainda).

Como vocês estão considerando esta questão da segurança? De ter certeza que um endpoint está sendo chamado exclusivamente pelo cron? 🤝

2

Fala Dechamps!

Primeiro, é um prazer ver você comentando aqui na nossa solução, isso de verdade é um baita motivador para nós.

Vamos lá, sua pergunta foi excelente e trouxe uma questão muito importante para a mesa, aqui do nosso lado, já temos mapeado uma possível solução para esta questão e vamos nos inspirar no que o Stripe faz com a segurança dos webhooks deles.

Basicamente, para trazer esta garantia de que os endpoints só irão ser chamados pelo NextCron, nós vamos adotar nos próximos dias a estratégia de HMAC (Hash-based Message Authentication Code), ou seja, com essa técnica, o NextCron pode incluir um hash de autenticação na solicitação, que é calculado usando uma chave secreta compartilhada e os dados da solicitação. Em seguida, seu aplicativo pode verificar se o hash na solicitação corresponde ao hash esperado, usando a mesma chave secreta.

Desta forma, acreditamos que iremos assegurar o conteúdo da solicitação enviada pelo NextCron e os endpoints em si.

Para isso, vamos disponibilizar uma biblioteca que fará esta integração de forma bem simplificada.

O que você acha desta alternativa?

1

Muito obrigado pela rápida resposta e acho essa alternativa ótima! Um detalhe é que, talvez isto deixaria a solução menos simples, pois o consumidor teria que implementar o cálculo do hash do lado dele. O Stripe já colocou isso dentro da lib deles, então nesse contexto fica fácil, pois a pessoa provavelmente já vai estar com essa lib instalada.

Talvez uma alternativa mais simples seja apenas enviar por cabeçalho uma chave que foi gerada por vocês (por exemplo, na criação da conta). Se eu tiver acesso a essa chave, basta eu colocar ela numa variável de ambiente do meu lado e fazer a conferência.

O último serviço que tive que usar dessa forma foi uma integração que fiz com a Hotmart. Eles disponibilizaram uma chave pelo painel deles, e num evento de webhook/callback eles mandam essa chave pelo cabeçalho. Isso não evita um replay attack (diferente do Stripe, que na assinatura tem um timer), mas é o suficiente, principalmente para a chamada de um cron. Faz sentido?

Se sim, sugiro primeiro implementar de forma simples e depois complicar se a demanda por isso se tornar uma realidade 🤝

2

Pronto! Acabei de subir os updates aqui e implementamos a sua sugestão no NextCron. Agora, em toda a requisição você receberá o token fornecido da conta em um parametro do header.

Na documentação você pode conferir o resultado:
https://docs.nextcron.co/security/protecting-endpoints

Novamente, te agradeço muito pelo seu feedback e sugestão, sentiu falta de mais alguma coisa?

Estava pensando aqui, eu acredito muito nessa ferramenta resolvendo a dor do desenvolvedor, você toparia usar em algum projeto seu? Faz sentido?

Grande abraço

1

Simplesmente sensacional, que agilidade absurda 😍

Eu topo testar sim! Estou programando uma plataforma de curso, usando Next.js e Vercel e, por ter menos movimento, as lambdas são desalocadas e a conexão com o banco é descartada... e isso é custoso de subir de novo. Posso usar o cron para esquentar as lambdas?

1

Muito Feliz por ter gostado!

Vai ser um prazer ter você testando a nossa solução, temos grandes planos para ela.

Acredito que ela resolve este problema sim, inclusive utilizamos em outras duas plataformas SaaS que também estão na Vercel para resolver um problema parecido com o supabase.

Posso te chamar em outro lugar para continuarmos esta conversa?

1
1

Excelente sugestão!

No caso, entregariamos isso pronto na Lib do NextCron, assim como o Stripe faz.

Mas, desta forma que você falou faz muito sentido. Vou trazer esta solução agora mesmo e já complementar a documentação.

1