49 lines
1.8 KiB
Markdown
49 lines
1.8 KiB
Markdown
# OTP Webhook example
|
|
|
|
This command implements the `telesrv` OTP Webhook v1 receiving side with only
|
|
the Go standard library. It validates the signed request, rejects expired or
|
|
invalid payloads, and deduplicates concurrent or repeated delivery IDs.
|
|
|
|
The default `exampleDelivery` function deliberately does **not** send a real
|
|
email/SMS and does not print the code or recipient. For local debugging only,
|
|
set `TELESRV_OTP_EXAMPLE_LOG_CODE=true` to print the received code while still
|
|
redacting the recipient. Replace that one function with the API call for your
|
|
email or SMS provider before real use.
|
|
|
|
## Run
|
|
|
|
```powershell
|
|
$env:TELESRV_OTP_EXAMPLE_SECRET = 'replace-with-a-random-secret'
|
|
$env:TELESRV_OTP_EXAMPLE_LOG_CODE = 'true' # local testing only
|
|
go run ./cmd/otpwebhook-example
|
|
```
|
|
|
|
The default endpoints are:
|
|
|
|
- `POST http://127.0.0.1:2800/v1/otp/deliveries`
|
|
- `GET http://127.0.0.1:2800/healthz`
|
|
|
|
Then configure `telesrv` with the same secret:
|
|
|
|
```dotenv
|
|
TELESRV_EMAIL_CODE_DELIVERY_PROVIDER=webhook
|
|
TELESRV_PHONE_CODE_DELIVERY_PROVIDER=webhook
|
|
TELESRV_OTP_WEBHOOK_URL=http://127.0.0.1:2800/v1/otp/deliveries
|
|
TELESRV_OTP_WEBHOOK_SECRET=replace-with-a-random-secret
|
|
```
|
|
|
|
The example accepts these optional settings:
|
|
|
|
```dotenv
|
|
TELESRV_OTP_EXAMPLE_ADDR=127.0.0.1:2800
|
|
TELESRV_OTP_EXAMPLE_MAX_SKEW=5m
|
|
TELESRV_OTP_EXAMPLE_LOG_CODE=false
|
|
```
|
|
|
|
The idempotency registry is intentionally in memory. A production receiver
|
|
must put delivery IDs and the downstream provider message ID in durable shared
|
|
storage before running more than one instance or surviving restarts. Pass the
|
|
same delivery ID to a downstream provider when it supports idempotency. The
|
|
example remembers both successful and failed outcomes until the code expires,
|
|
because an apparent downstream failure may have happened after it sent the
|
|
message.
|