Altcha
Alternatywa open-source równoważna reCaptcha.
Wprowadzenie
Implementacja mechanizmu bezpieczeństwa z captchą jest niezwykle istotna, oto kilka istotnych powodów:
- Aby zapobiec automatycznym dostępom robotów do adresów API.
- Aby zagwarantować, że dostęp wykonuje prawdziwa osoba.
- Gwarantuje również, że dostęp nastąpił z przeglądarki.
Przez długi czas mechanizm captchy oferował użytkownikowi wyzwanie do wypełnienia.
Obecnie jest to zbędne, ponieważ stosuje się mechanizm szyfrowanych kluczy w połączeniu z wyzwaniem, które musi zostać rozwiązane przez algorytm wykorzystujący interakcję w przeglądarce, w ten sposób wykrywa, czy interakcja jest ludzka, czy zrobotyzowana.
Ta metoda jest pomysłowa i niezawodna, wystarczy jedno kliknięcie, aby wykryć, czy to człowiek, czy robot.
Altcha to projekt open-source, który implementuje ten proces bezpieczeństwa, z widżetem frontendowym, który integruje się również z Reactem, oraz mechanizmem backendowym, który oferuje Netuno.
Ograniczenia
Altcha wykorzystuje Web Crypto API, działa tylko na bezpiecznych adresach HTTPS z certyfikatem SSL lub lokalnie.
W frontendzie, jeśli domena nie jest
localhost, URL musi koniecznie być bezpiecznym HTTPS z certyfikatem SSL.
Gdy frontend jest dostępny lokalnie, przeglądarki pozwalają na korzystanie z Web Crypto API
tylko pod adresem lokalnym, koniecznie localhost, w przeciwnym razie wymagany jest bezpieczny HTTPS z
certyfikatem SSL.
Backoffice
Aby aktywować uwierzytelnianie z Altcha w backoffice Twojej aplikacji Netuno, użyj następującej konfiguracji w aplikacji:
{
...
"auth": {
"altcha": {
"admin": {
"enabled": true
}
}
},
...
}
Gotowe, teraz wystarczy przejść do ekranu logowania backoffice, a zobaczysz checkbox Altcha w pełni działający.
Jak to działa
Netuno udostępnia w API REST standardową usługę, która dostarcza parametry Altcha do frontendu, zazwyczaj adres tej usługi to:
http://localhost:9000/services/_altcha
Z parametrami widżet Altcha w frontendzie generuje wynik wyzwania podpisany cyfrowo, który
jest wysyłany do backendu w ukrytym polu altcha formularza.
W backendzie sprawdzane jest, czy wynik i podpis cyfrowy są rzeczywiście poprawne.
Widżet w HTML
Przykład integracji widżetu w HTML logowania 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>
Zauważ, że URL użyty w atrybucie challenge widżetu jest usługą automatycznie generowaną przez Netuno z
parametryzacją wyzwania.
Uwierzytelnianie zewnętrzne
Uwierzytelnianie zazwyczaj implementowane i bezpieczne z JWT wykorzystuje standardową usługę API REST do uwierzytelniania, którą zwykle jest:
http://localhost:9000/services/_auth
Ta usługa automatycznie generowana przez Netuno pozwala zagwarantować bezpieczeństwo dla zewnętrznego uwierzytelniania z natywnym JWT, ale również dokonuje walidacji wyniku wyzwania widżetu captchy.
Aby aktywować Altcha w uwierzytelnianiu, dodaj konfigurację:
{
...
"auth": {
"altcha": {
"enabled": true
}
},
...
}
W ten sposób tylko żądania uwierzytelniania, czyli logowania, które wyślą klucz wyniku wyzwania wygenerowanego przez Altcha i który będzie ważny, będą mogły się pomyślnie uwierzytelnić, w przeciwnym razie logowanie zostanie zablokowane.
W frontendzie musi zostać zintegrowany widżet Altcha oraz wysłany klucz wyniku wyzwania w polu
altcha.
Widżet w React
Zobacz poniżej, jak zintegrować widżet w React:
Dodaj zależność Altcha:
bun add altcha
Zaimportuj Altcha w kodzie:
import "altcha/i18n";
Utwórz stan do przechowywania klucza wyniku wyzwania:
const [altchaPayload, setAltchaPayload] = useState(null);
Utwórz wewnętrzne odwołanie w komponencie React do widżetu:
const altcha = useRef(null);
Dodaj efekt ładowania komponentu, który wykorzystuje odwołanie do widżetu, z zdarzeniem obserwującym, kiedy checkbox widżetu zostanie kliknięty, aby załadować klucz wyniku wyzwania do stanu:
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]);
Przykład widżetu w "HTML" komponentu React:
<altcha-widget
ref={altcha}
challenge={_service.url('/_altcha')}
language="pt"
delay={1}
hideLogo={true}
hideFooter={true}
></altcha-widget>
Auth Client
Zobacz, jak zintegrować Altcha z Auth Client.
Użyj poniższego kodu w zdarzeniu, które wysyła dane formularza logowania do backendu,
takim jak zdarzenia onSubmit, onClick lub onFinish formularzy Ant.Design:
_auth.login({
username,
password,
data: (data) => {
data.altcha = altchaPayload;
return data;
},
success: ({json}) => {
...
},
fail: (data) => {
...
}
});
Zauważ, że altchaPayload to stan, który zawiera klucz wyniku wyzwania captchy.
Pełny przykład na stronie logowania ReAuthKit:
Integracja w usługach
Oprócz uwierzytelniania, jak widzieliśmy powyżej, w każdym innym rodzaju usługi można zintegrować mechanizm captchy z Altcha.
Zaleca się integrację captchy w każdej publicznej usłudze, która może być celem ataków, takiej jak wyczerpująca automatyzacja robotów w celu masowej rejestracji danych.
W frontendzie, na ekranie, na którym zintegrowana jest usługa API REST, należy również zaimplementować widżet bezpieczeństwa Altcha, czyli tam, gdzie wywoływana jest usługa, należy użyć widżetu.
Service Client
Zobacz poniżej, jak zintegrować Altcha z Service Client.
Integracja widżetu w frontendzie jest podobna do już wyjaśnionej powyżej w:
Musimy uzyskać payload widżetu, dokładnie tak jak już zostało to zilustrowane powyżej, proces jest taki sam jak w przypadku uwierzytelniania logowania.
Payload jest wysyłany do backendu poprzez parametr w URL, pole Formularza lub jako właściwość w JSON, zależy to od metody HTTP i sposobu implementacji usługi.
Przykład wysłania payloadu do usługi rejestracji lub utworzenia nowego konta użytkownika:
_service({
method: 'POST',
url: 'register',
data: {
name,
email,
password,
altcha: altchaPayload
},
success: (response) => {
...
},
fail: (e) => {
...
}
});
Zauważ, że altchaPayload to stan, który zawiera klucz wyniku wyzwania captchy.
Pełny przykład na stronie rejestracji ReAuthKit:
Backend
Gdy payload jest wysyłany do usługi API REST, w kodzie usługi, po stronie backendu, musimy go zwalidować, zobacz jak:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
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();
}
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();
}
altchaPayload = _req.getString("altcha")
if _auth.altchaEnabled() and _altcha.verifySolution(altchaPayload) == False:
_header.status(409)
_out.json(
_val.map()
.set("error", "invalid-altcha-payload")
)
_exec.stop()
altchaPayload = _req.getString("altcha")
if _auth.altchaEnabled() and _altcha.verifySolution(altchaPayload) == false
_header.status(409)
_out.json(
_val.map()
.set("error", "invalid-altcha-payload")
)
_exec.stop()
end
val altchaPayload = _req.getString("altcha")
if (_auth.altchaEnabled() && !_altcha.verifySolution(altchaPayload)) {
_header.status(409)
_out.json(
_val.map()
.set("error", "invalid-altcha-payload")
)
_exec.stop()
}
final altchaPayload = _req.getString("altcha")
if (_auth.altchaEnabled() && !_altcha.verifySolution(altchaPayload)) {
_header.status(409)
_out.json(
_val.map()
.set("error", "invalid-altcha-payload")
)
_exec.stop()
}
Pełny przykład usługi rejestracji ReAuthKit:
Zobacz więcej o funkcjach programowania low-code i poliglotycznego:
Podsumowanie
W bardzo uproszczony sposób możemy stworzyć mechanizm bezpieczeństwa w usługach API, aby uniknąć robotów i zagwarantować interakcję ludzi w przeglądarce.
Zaleca się stosowanie mechanizmu captchy z Altcha w najbardziej wrażliwych usługach publicznych, takich jak usługi rejestracji i uwierzytelniania.
Dzięki natywnej implementacji oferowanej przez Netuno aktywacja i używanie tego mechanizmu w dowolnej usłudze API REST staje się bardzo proste.
Zaleca się, aby automatycznie generowany backoffice Netuno miał zawsze uwierzytelnianie z Altcha aktywowane w środowisku produkcyjnym oraz z HTTPS i certyfikatem SSL.
Zawsze, gdy to możliwe, używaj Altcha, aby zagwarantować bezpieczeństwo i solidność publicznym usługom Twojego API.