Python¶
Das Paket myra-eucaptcha prüft das Token auf dem Server. Es stellt eine synchrone und eine asynchrone Schnittstelle bereit.
Voraussetzungen¶
Die folgenden Voraussetzungen müssen erfüllt sein:
| Voraussetzung | Wert |
|---|---|
| Paketverwaltung | pip oder uv |
| Zugangsdaten | Öffentlicher Sitekey und Secret aus der Ansicht Details |
Paket installieren¶
Installieren Sie das Paket aus PyPI:
Mit der Paketverwaltung uv lautet der Befehl:
Widget einbinden¶
Fügen Sie das Widget in das zu schützende Formular ein:
Ergänzen Sie die Seite um den Skript-Verweis:
Das Skript zeichnet das Widget, führt die Challenge aus und ergänzt das Formular um das Token.
Eine vollständige Seite sieht damit wie folgt aus:
<html>
<head>
<title>captcha integration sample</title>
</head>
<body>
<form action="/login" method="post">
<table>
<tr>
<td>user</td>
<td>
<input type=text name="username" />
</td>
</tr>
<tr>
<td>pass</td>
<td>
<input type=password name="password" />
</td>
</tr>
<tr>
<td colspan="2">
<div class="eu-captcha" data-sitekey="EUCAPTCHA_SITE_KEY"></div>
</td>
</tr>
<tr><td colspan="2"><input type="submit" name="submit" /></td></tr>
</table>
</form>
<script src="https://cdn.eu-captcha.eu/verify.js" async defer></script>
</body>
</html>
Token prüfen¶
Das folgende Beispiel zeigt die serverseitige Prüfung mit FastAPI:
from myra_eucaptcha import MyraEuCaptchaClient, MyraEuCaptchaClientConfig
@app.post("/login", response_class=HTMLResponse)
async def login(
request:Request,
username: str = Form(...),
password: str = Form(...),
eu_captcha_response: str = Form(..., alias="eu-captcha-response"),
):
# configure the captcha settings and behaviour
captcha_config = MyraEuCaptchaClientConfig(
sitekey="EUCAPTCHA_SITE_KEY",
secret="EUCAPTCHA_SECRET_KEY",
)
client = MyraEuCaptchaClient(config=captcha_config)
# this is depending on your webserver-setup and whether we're behind
# a reverse-proxy (nginx, apache, traefik, or something similar.)
remote_addr = request.headers.get('x-real-ip','')
validationresult = await client.avalidate(
token=eu_captcha_response,
remote_addr=remote_addr)
if validationresult.success:
# yay - all good.
# <your-code-here>
pass
else:
# validation failed, check validationresult.errors
# <your-code-here>
pass
Die asynchrone Prüfung erfolgt über avalidate(), die synchrone über validate().
Woher die IP-Adresse des Besuchers stammt, hängt von Ihrem Webserver ab. Steht die Anwendung hinter einem vorgelagerten System wie nginx, Apache oder Traefik, lesen Sie die Adresse aus der entsprechenden Kopfzeile.
Verhalten bei Fehlern¶
In der Voreinstellung ist das Paket fehlertolerant: Bei einer Zeitüberschreitung, einem API-Fehler oder einem Netzwerkfehler liefert die Prüfung das Ergebnis True, und es wird keine Ausnahme ausgelöst. Die aufgetretenen Fehler stehen in MyraEuCaptchaResult.errors.
Sie ändern dieses Verhalten über MyraEuCaptchaClientConfig:
captcha_config = MyraEuCaptchaClientConfig(
sitekey="EUCAPTCHA_SITE_KEY",
secret="EUCAPTCHA_SECRET_KEY",
connect_timeout: int = 3
read_timeout: int = 10
write_timeout: int = 10
pool_timeout: int = 3
default_result_on_error:bool = True ## this is the validation result, that is returned on exceptions
suppress_exceptions:bool = True ## if you want exceptions to be raised, set this to False
)
| Einstellung | Vorgabe | Wirkung |
|---|---|---|
connect_timeout |
3 |
Zeitgrenze für den Verbindungsaufbau in Sekunden. |
read_timeout |
10 |
Zeitgrenze für das Lesen der Antwort in Sekunden. |
write_timeout |
10 |
Zeitgrenze für das Senden der Anfrage in Sekunden. |
pool_timeout |
3 |
Zeitgrenze für eine freie Verbindung aus dem Verbindungsspeicher in Sekunden. |
default_result_on_error |
True |
Ergebnis der Prüfung, wenn eine Ausnahme auftritt. |
suppress_exceptions |
True |
Auf False löst das Paket die Ausnahme aus, statt sie zu unterdrücken. |
Für Django siehe Django.
Vollständiges Beispiel¶
Siehe Vue und Python.