mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 23:51:13 +00:00
f979e18811
Option B per user decision: production ships with empty Jwt.Issuer / Jwt.Audience in appsettings.json so the API process refuses to start unless JWT_ISSUER + JWT_AUDIENCE env vars are supplied. Development ships with grep-friendly DEV-ONLY- placeholders so local + docker flows keep working unchanged. AuthenticationServiceCollectionExtensions flips ValidateIssuer + ValidateAudience to true and wires ValidIssuer / ValidAudience via a new ResolveRequiredOrThrow helper that all three required values (secret, iss, aud) now share. JwtTokenFactory.Create + CreateExpired gain optional iss / aud parameters (default null) so existing call sites compile unchanged. JwtTestHelpers adds MintAuthenticated / MintExpired wrappers that resolve iss + aud from env, plus ResolveIssuerOrThrow / ResolveAudienceOrThrow. PerfBootstrap.MintToken + Program.cs JWT bootstrap migrated to the new surface so the perf harness and the integration runner both validate against the same contract. Adds 4 fail-fast unit tests (missing/empty issuer + audience), 2 negative integration scenarios (WrongIssuer_Returns401, WrongAudience_Returns401), and re-tags every existing integration mint site via MintAuthenticated. Compose, .env.example, run-tests.sh, run-performance-tests.sh all load + export JWT_ISSUER + JWT_AUDIENCE alongside JWT_SECRET. Resolves F-AUTH-2 (security_report.md + owasp_review.md). AC-7 (cross-repo suite/_docs/10_auth.md write) deferred — outside this workspace; tracked in deploy_cycle2.md R3 follow-up. Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
1.7 KiB
JSON
68 lines
1.7 KiB
JSON
{
|
|
"Serilog": {
|
|
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
|
|
"MinimumLevel": {
|
|
"Default": "Warning",
|
|
"Override": {
|
|
"Microsoft.AspNetCore": "Warning"
|
|
}
|
|
},
|
|
"WriteTo": [
|
|
{ "Name": "Console" },
|
|
{
|
|
"Name": "File",
|
|
"Args": {
|
|
"path": "./logs/satellite-provider-.log",
|
|
"rollingInterval": "Day",
|
|
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"AllowedHosts": "*",
|
|
"ConnectionStrings": {
|
|
"DefaultConnection": "Host=localhost;Database=satelliteprovider;Username=postgres;Password=postgres"
|
|
},
|
|
"Jwt": {
|
|
"Secret": "",
|
|
"Issuer": "",
|
|
"Audience": ""
|
|
},
|
|
"UavQuality": {
|
|
"MinBytes": 5120,
|
|
"MaxBytes": 5242880,
|
|
"MaxAgeDays": 7,
|
|
"CapturedAtFutureSkewSeconds": 30,
|
|
"MinLuminanceVariance": 10.0,
|
|
"MaxBatchSize": 100,
|
|
"LuminanceSampleSize": 32
|
|
},
|
|
"MapConfig": {
|
|
"Service": "GoogleMaps",
|
|
"ApiKey": "",
|
|
"TileSizePixels": 256,
|
|
"AllowedZoomLevels": [ 15, 16, 17, 18, 19 ],
|
|
"RetryBaseDelaySeconds": 1,
|
|
"RetryMaxDelaySeconds": 30
|
|
},
|
|
"StorageConfig": {
|
|
"TilesDirectory": "./tiles",
|
|
"ReadyDirectory": "./ready"
|
|
},
|
|
"ProcessingConfig": {
|
|
"MaxConcurrentDownloads": 4,
|
|
"MaxConcurrentRegions": 20,
|
|
"DefaultZoomLevel": 20,
|
|
"QueueCapacity": 1000,
|
|
"DelayBetweenRequestsMs": 50,
|
|
"SessionTokenReuseCount": 100,
|
|
"RegionProcessingTimeoutSeconds": 300,
|
|
"RouteProcessingPollIntervalSeconds": 5,
|
|
"MaxRoutePointSpacingMeters": 200.0,
|
|
"LatLonTolerance": 0.0001
|
|
},
|
|
"CorsConfig": {
|
|
"AllowedOrigins": []
|
|
}
|
|
}
|