mirror of
https://github.com/sonr-io/sonr.git
synced 2026-08-02 17:31:39 +00:00
9.1 KiB
9.1 KiB
Motor WASM Service Worker - Payment Gateway & OIDC Authorization
Motor is a WebAssembly-based HTTP server that runs as a Service Worker in the browser, providing secure payment processing and OpenID Connect (OIDC) authorization without requiring backend infrastructure.
Overview
Motor implements a comprehensive payment gateway and identity provider that runs entirely in the browser:
- Payment Gateway: W3C Payment Handler API compliant payment processing with PCI DSS compliance
- OIDC Authorization: Complete OpenID Connect provider with JWT token management
- Service Worker: Runs as a browser service worker using go-wasm-http-server
Features
Payment Gateway (W3C Payment Handler API)
- ✅ Process payment transactions securely
- ✅ PCI DSS compliant card tokenization
- ✅ Card validation (Luhn algorithm, CVV, expiry)
- ✅ Transaction signing with HMAC-SHA256
- ✅ AES-256-GCM encryption for sensitive data
- ✅ Payment method validation
- ✅ Refund processing
- ✅ Comprehensive audit logging
OIDC Authorization
- ✅ Discovery endpoint (
.well-known/openid-configuration) - ✅ Authorization endpoint with PKCE support
- ✅ Token endpoint with JWT generation
- ✅ UserInfo endpoint
- ✅ JWKS endpoint for key rotation
- ✅ RS256 JWT signing
- ✅ Refresh token support
Security Features
- ✅ Rate limiting (100 requests/minute per client)
- ✅ Origin validation
- ✅ Security headers (CSP, X-Frame-Options, etc.)
- ✅ CORS configuration
- ✅ Secure token generation
- ✅ Card number masking
- ✅ Sensitive data sanitization
API Endpoints
Payment Gateway Endpoints
Process Payment
POST /api/payment/process
Content-Type: application/json
{
"method": "card",
"amount": 100.00,
"currency": "USD",
"card_number": "4111111111111111",
"cvv": "123",
"expiry_month": 12,
"expiry_year": 2025,
"billing_address": {
"line1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postal_code": "94105",
"country": "US"
}
}
Validate Payment Method
POST /api/payment/validate
Content-Type: application/json
{
"method": "card",
"card_number": "4111111111111111",
"cvv": "123",
"expiry_month": 12,
"expiry_year": 2025
}
Get Payment Status
GET /api/payment/status/:id
Process Refund
POST /api/payment/refund
Content-Type: application/json
{
"payment_id": "pay_abc123",
"amount": 50.00,
"reason": "Customer request"
}
W3C Payment Handler API
GET /payment/instruments
POST /payment/canmakepayment
POST /payment/paymentrequest
OIDC Endpoints
Discovery
GET /.well-known/openid-configuration
Authorization
GET /authorize?client_id=CLIENT_ID&redirect_uri=URI&response_type=code&scope=openid%20profile
Token Exchange
POST /token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=AUTH_CODE&client_id=CLIENT_ID
UserInfo
GET /userinfo
Authorization: Bearer ACCESS_TOKEN
JWKS
GET /.well-known/jwks.json
Health & Monitoring
GET /health
GET /status
Building
Using Make
# Build Motor WASM module
make motr-wasm
# Or build directly
cd cmd/motr
GOOS=js GOARCH=wasm go build -o ../../packages/es/src/plugins/motor/motor.wasm .
Build Output
The WASM module is built to: packages/es/src/plugins/motor/motor.wasm
Integration
Service Worker Registration
// motor-worker.js
importScripts('https://cdn.jsdelivr.net/gh/golang/go@go1.23.4/misc/wasm/wasm_exec.js');
importScripts('https://cdn.jsdelivr.net/gh/nlepage/go-wasm-http-server@v2.2.1/sw.js');
// Register Motor WASM as HTTP listener
registerWasmHTTPListener('motor.wasm', {
base: '/api'
});
TypeScript Client Usage
import { PaymentGatewayClient, OIDCClient } from '@sonr.io/es/plugins/motor';
// Initialize clients
const payment = new PaymentGatewayClient('https://localhost:3000');
const oidc = new OIDCClient('https://localhost:3000');
// Process a payment
const result = await payment.processPayment({
method: 'card',
amount: 100.00,
currency: 'USD',
card_number: '4111111111111111',
cvv: '123',
expiry_month: 12,
expiry_year: 2025
});
// OIDC authorization flow
const authUrl = await oidc.buildAuthorizationUrl({
client_id: 'my-app',
redirect_uri: 'https://myapp.com/callback',
scope: 'openid profile email'
});
// Exchange authorization code for tokens
const tokens = await oidc.exchangeCode('auth_code_here', 'code_verifier');
Security Implementation
PCI DSS Compliance
- Tokenization: Cards are immediately tokenized, raw data never stored
- Encryption: AES-256-GCM for all sensitive data at rest
- Masking: Card numbers always masked except last 4 digits
- Audit Logging: Complete audit trail for compliance
- CVV Handling: CVV never stored, only validated
Transaction Security
- Signing: HMAC-SHA256 signatures on all transactions
- Verification: Signature verification before processing
- Tamper Detection: Any modification invalidates transaction
- Idempotency: Duplicate transaction prevention
Authentication Security
- JWT Signing: RS256 with 2048-bit RSA keys
- PKCE: Proof Key for Code Exchange for authorization flow
- Token Expiration: Configurable expiration (default 1 hour)
- Refresh Tokens: Secure refresh token rotation
Testing
Unit Tests
# Run unit tests (without WASM constraints)
go test ./cmd/motr/...
Integration Tests
# Build WASM first
make motr-wasm
# Run integration tests
cd cmd/motr
GOOS=js GOARCH=wasm go test -v
Test Coverage
- ✅ Payment processing flows
- ✅ Card validation (Luhn, CVV, expiry)
- ✅ Tokenization and encryption
- ✅ Transaction signing/verification
- ✅ OIDC discovery and flows
- ✅ JWT generation/validation
- ✅ Rate limiting
- ✅ Security headers
- ✅ PCI compliance features
Performance
Bundle Size
- WASM module: ~3-4MB (production build)
- Service Worker: ~10KB
- TypeScript client: ~25KB (minified)
Optimization
- Built with
-ldflags="-s -w"for size reduction - Gzip compression reduces transfer to ~1MB
- Lazy loading recommended for optimal performance
Benchmarks
- Payment processing: <100ms average
- Token generation: <50ms
- Card validation: <10ms
- Encryption/decryption: <20ms
Browser Compatibility
| Feature | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| Service Workers | 45+ | 44+ | 11.1+ | 17+ |
| WebAssembly | 57+ | 52+ | 11+ | 16+ |
| Payment Handler | 68+ | - | - | 79+ |
| Full Support | 68+ | 52+* | 11.1+* | 79+ |
*Payment Handler API has limited support
Configuration
Environment Variables
// Configure in service worker
const config = {
issuer: 'https://motor.sonr.io',
rateLimit: 100, // requests per minute
rateWindow: 60000, // milliseconds
tokenExpiry: 3600, // seconds
allowedOrigins: ['https://localhost:3000']
};
Security Settings
- Rate limiting: Configurable per-client limits
- CORS: Configurable allowed origins
- CSP: Customizable content security policy
- Token expiry: Adjustable for different use cases
Development
Prerequisites
- Go 1.21+ (1.23+ recommended)
- Modern browser with Service Worker support
- HTTPS or localhost (Service Workers requirement)
Local Development
# Build WASM module
make motr-wasm
# Start local server (example)
cd packages/es/src/plugins/motor
python3 -m http.server 8080 --bind localhost
# Access at https://localhost:8080
Debugging
- Browser DevTools: Network tab for API inspection
- Service Worker: Application tab for SW debugging
- Console: WASM logs and errors
- Payment Handler: chrome://settings/content/paymentHandler
Production Deployment
Best Practices
- HTTPS Required: Service Workers only work over HTTPS
- Cache Strategy: Implement proper cache headers
- Error Handling: Comprehensive error logging
- Monitoring: Track payment success rates
- Compliance: Regular PCI DSS audits
Deployment Checklist
- Configure production issuer URL
- Set appropriate rate limits
- Configure allowed origins
- Enable production encryption keys
- Set up monitoring and alerting
- Configure backup payment processors
- Implement fraud detection rules
- Schedule security audits
Troubleshooting
Common Issues
Service Worker Not Registering
- Ensure HTTPS or localhost
- Check browser compatibility
- Verify WASM file path
Payment Processing Errors
- Validate card details format
- Check rate limiting
- Verify origin is allowed
OIDC Flow Issues
- Ensure redirect URI matches
- Check PKCE implementation
- Verify token expiration
Debug Mode
Enable debug logging in the service worker:
// motor-worker.js
const DEBUG = true;
License
This implementation is part of the Sonr project and follows the same license terms.
Support
For issues, questions, or contributions:
- GitHub Issues: https://github.com/sonr-io/sonr/issues
- Documentation: https://docs.sonr.io
- Security: security@sonr.io (for security vulnerabilities)