Security Guide#
Security best practices for AuxCORE integration.
🔐 API Security#
Protect API Keys#
- Store in environment variables
- Never commit to git
- Rotate regularly (create a new key at
/settings/developer/api-keys, deploy it, then revoke the old one) - Use different keys per environment (Sandbox
uat.auxcore.netand Productionapp.auxcore.netkeys are separate) - Only SDK public keys (
lpk_live_…) may appear in browser code; configure their allowed origins so they are refused from other sites (requests withoutOrigin/X-Merchant-Originare then rejected with 403)
Use HTTPS#
- All API calls over HTTPS
- Verify SSL certificates
- No HTTP fallbacks
Respect Rate Limits#
- The gateway answers
429when a limit is hit; token/checkout endpoints allow 30 requests per 15 minutes per IP, OTP generate/resend 10 per hour - Read the standard
RateLimit-*response headers and back off exponentially - Monitor for anomalies
💳 Payment Security#
PCI Compliance#
- Never store full card numbers
- Collect cards with the PCI SDK (
https://vault.auxcore.net/sdk/auxVault.js) and send onlypci_tok_…tokens — rawCardNumberis rejected with400 PCI_SCOPE_VIOLATION - Server-side
POST /api/v1/public/tokenize-cardaccepts raw card data and requires a secret key; using it puts your servers in PCI scope - Don't log sensitive data
- Follow PCI DSS guidelines
Verify Webhooks#
Every delivery carries X-Webhook-Signature: t=<unix>,v1=<hex>. Recompute HMAC-SHA256 over "<t>.<raw body>" with the endpoint's signing secret, compare in constant time, and reject timestamps more than 5 minutes away from the current time, including future timestamps.
Copy the complete verifySignature() helper from the Node.js webhook example into your server code and reuse it across handlers. It validates header types, a positive safe-integer timestamp and a 64-character hexadecimal signature before comparing equal-length buffers. Missing or malformed input returns false.
// Inside a route mounted with express.raw({ type: 'application/json' }).
const rawBody = req.body.toString('utf8');
if (!verifySignature(rawBody, req.headers['x-webhook-signature'], secret)) {
return res.status(401).send('Invalid signature');
}Register the raw-body route before express.json() and validate your signing-secret configuration at startup. Parse JSON only after verification. Deduplicate event.id using an atomic insert into a durable inbox with a unique constraint; return 2xx only after the event is stored for processing, including duplicate deliveries. Storage failures must return 5xx so the sender can retry. Make worker side effects idempotent as well. See the integration guide for the receiver pattern.
🛡️ Fraud Prevention#
- Enable AVS/CVV filters
- Set transaction limits
- Monitor for suspicious patterns
- Use risk scoring
Need help? Contact support@auxcore.net