Altcha
Alternativa open-source equivalente ao reCaptcha.
Introdução
A implementação do mecanismo de segurança com captcha é de extrema importância, segue alguns motivos pertinentes:
- Evitar que os robôs fiquem fazendo acessos automáticos aos endereços da API.
- Garantir que o acesso é feito por uma pessoa real.
- Também garante que o acesso foi feito com um navegador.
Durante muito tempo o mecanismo de captcha oferecia um desafio para o usuário preencher.
Hoje em dia isso é desnecessário, porque é utilizado um mecanismo de chaves encriptadas combinado com desafio que precisa ser resolvido por algoritmo que utiliza a interação no navegador, assim detecta se é uma interação humana ou robotizada.
Esse método é engenhoso e fiável, com apenas um click é detectado se é humano ou robô.
O Altcha é um projeto open-source que implementa esse processo de segurança, com um widget de frontend que também integra com o React, e recurso de backend que o Netuno oferece.
Limitações
O Altcha utiliza a Web Crypto API, apenas funciona em endereços HTTPS seguros com certificado SSL, ou localmente.
No frontend caso o domínio não seja
localhosta URL obrigatoriamente precisa ser HTTPS segura com certificado SSL.
Quando o frontend é acessado localmente os navegadores permitem utilizar a Web Crypto API
apenas no endereço local, obrigatoriamente localhost, portanto caso contrário exige HTTPS seguro com
certificado SSL.
Backoffice
Para ativar a autenticação com Altcha no backoffice da sua aplicação Netuno, utilize a seguinte configuração na aplicação:
{
...
"auth": {
"altcha": {
"admin": {
"enabled": true
}
}
},
...
}
Pronto, agora basta acessar a tela de login do backoffice e já vai ver a checkbox do Altcha em pleno funcionamento.
Como Funciona
O Netuno fornece na API REST um serviço padrão que fornecer os parâmetros do Altcha para o frontend, normalmente o endereço deste serviço é:
http://localhost:9000/services/_altcha
Com os parâmetros o widget do Altcha no frontend gera o resultado do desafio assinado digitalmente, o que
é enviado para o backend no campo oculto altcha do formulário.
No backend é validado se o resultado e a assinatura digital estão realmente corretos.
Widget no HTML
Exemplo de como o widget é integrado no HTML de login do backoffice:
<script type="text/javascript" src="/scripts/plugins/altcha/altcha.i18n.umd.min.cjs"></script>
<form ...>
<input id="inputAltcha" type="hidden" name="altcha" value="">
<altcha-widget id="widgetAltcha"
challenge="/services/_altcha" language="pt"
hideLogo hideFooter></altcha-widget>
<script>
document.getElementById("widgetAltcha").addEventListener("statechange", function (e) {
if (e.detail.state === "verified") {
document.getElementById("inputAltcha").value = e.detail.payload;
}
}, false);
</script>
...
</form>
Repare que a URL utilizada no atributo challenge do widget, é o serviço autogerado pelo Netuno com a
parametrização do desafio.
Autenticação Externa
Para ativar o Altcha na autenticação, que normalmente é implementada e segura com JWT, utiliza-se o serviço padrão da API REST para autenticação, o qual costuma ser:
http://localhost:9000/services/_auth
Este serviço autogerado pelo Netuno permite garantir a segurança para autenticação externa com JWT nativo, mas também faz a validação do resultado de desafio do widget de captcha.
Para ativar o Altcha na autenticação, adicione a configuração:
{
...
"auth": {
"altcha": {
"enabled": true
}
},
...
}
Assim apenas os pedidos de autenticação, ou seja, os logins que enviem a chave do resultado do desafio gerado pelo Altcha e que seja válida é que poderão autenticar com sucesso, caso contrário o login será barrado.
Deve ser integrado no frontend o widget do Altcha e enviar a chave do resultado de desafio no campo
altcha.
Widget no React
Veja abaixo como fazer a integração do widget no React:
Adicione a dependência do Altcha:
bun add altcha
Importe o Altcha no código:
import "altcha/i18n";
Crie o estado para armazenar a chave do resultado de desafio:
const [altchaPayload, setAltchaPayload] = useState(null);
Crie uma referência interna no componente React para o widget:
const altcha = useRef(null);
Adicione o efeito de carregamento do componente que utiliza a referência do widget, com evento que observa quando a checkbox do widget for clicada para carregar a chave do resultado de desafio no estado:
useEffect(() => {
if (altcha && altcha.current) {
function altchaVerified(ev) {
if (ev.detail.state === "verified") {
setAltchaPayload(ev.detail.payload);
}
}
altcha.current.addEventListener("statechange", altchaVerified, false);
return () => {
if (altcha.current != null) {
altcha.current.removeEventListener("statechange", altchaVerified, false);
}
}
}
}, [altcha]);
Exemplo do widget no "HTML" do componente React:
<altcha-widget
ref={altcha}
challenge={_service.url('/_altcha')}
language="pt"
delay={1}
hideLogo={true}
hideFooter={true}
></altcha-widget>
Auth Client
Veja como integrar o Altcha no Auth Client.
Utilize o código abaixo no evento que envia os dados do formulário de login para o backend,
como os eventos de onSubmit, onClick, ou o onFinish dos formulários do Ant.Design:
_auth.login({
username,
password,
data: (data) => {
data.altcha = altchaPayload;
return data;
},
success: ({json}) => {
...
},
fail: (data) => {
...
}
});
Repare que o altchaPayload é o estado que tem a chave do resultado de desafio do captcha.
Exemplo completo na página de Login do ReAuthKit:
Integração em Serviços
Além da autenticação como vimos acima, em qualquer outro tipo de serviço pode ser integrado o mecanismo de captcha com o Altcha.
É recomendado fazer a integração do captcha em qualquer serviço público que possa ser alvo de ataques, como a automação exaustiva de robôs para o registro massivo de dados.
No frontend, na tela em que o serviço da API REST é integrado também o widget de segurança do Altcha deve ser implementado, ou seja, onde o serviço é chamado deve ser utilizado o widget.
Service Client
Veja a seguir como integrar o Altcha no Service Client.
A integração do widget no frontend é semelhante como já foi explicado acima em:
Precisamos obter o payload do widget, exatamente como já foi exemplificado acima, segue o mesmo processo da autenticação de login.
O payload é enviado para o backend através de um parâmetro na URL, campo do Form, ou ainda como uma propriedade no JSON, depende do método HTTP e como é feita a implementação do serviço.
Exemplo de como enviar o payload para o serviço de registro, ou cadastro de uma nova conta de usuário:
_service({
method: 'POST',
url: 'register',
data: {
name,
email,
password,
altcha: altchaPayload
},
success: (response) => {
...
},
fail: (e) => {
...
}
});
Repare que o altchaPayload é o estado que tem a chave do resultado de desafio do captcha.
Exemplo completo na página de Registro do ReAuthKit:
Backend
Com o payload sendo enviado para o serviço da API REST, então no código do serviço, no lado do backend temos que validá-lo, veja como:
const altchaPayload = _req.getString("altcha");
if (_auth.altchaEnabled() && !_altcha.verifySolution(altchaPayload)) {
_header.status(409);
_out.json(
_val.map()
.set("error", `invalid-altcha-payload`)
);
_exec.stop();
}
Exemplo completo do serviço de Registro do ReAuthKit:
Veja mais sobre os recursos de programação low-code e poliglota:
Conclusão
De forma bastante simplificada podemos criar um mecanismo de segurança nos serviços da API para evitar robôs e garantir a interação por humanos no navegador.
É recomendado utilizar o mecanismo de captcha com o Altcha nos serviços públicos mais sensíveis, como os serviços de registro e autenticação.
Com a implementação nativa que o Netuno oferece torna-se muito simples ativar e utilizar este mecanismo em qualquer serviço da API REST.
Recomenda-se que o backoffice autogerado do Netuno sempre tenha a autenticação com Altcha ativada em produção, e com HTTPS e certificado SSL.
Sempre que possível utilize o Altcha para garantir segurança e robustez aos serviços públicos da sua API.