Issue: #17
The API uses JWT bearer authentication with role-based authorization.
- Algorithm:
HS256 - Required claims:
iss(issuer) must matchJWT_ISSUERexp(expiration) must be validrolemust be one of:uploader,runner,analyst,admin
- Upload APIs (
uploader|admin):POST /v1/jobs/fastq-upload/metadataPOST /v1/jobs/fastq-upload/{job_id}/validatePOST /v1/objects/multipartPOST /v1/objects/multipart/{upload_id}/partsPOST /v1/objects/multipart/{upload_id}/complete
- Run/orchestration APIs (
runner|admin):POST /v1/jobs/pipelinePOST /v1/jobs/{job_id}/runGET /v1/jobs/{job_id}/statusGET /v1/jobs/{job_id}/outputs
- Query APIs (
analyst|admin):GET /v1/variants
JWT_SECRET(required): signing key for API JWT validationJWT_ISSUER(required): expected token issuer
- Generate a new strong secret in your secret manager (do not commit to git).
- Update runtime environment (
JWT_SECRET) in deployment platform. - Redeploy API instances with the new secret.
- Invalidate and re-issue client tokens signed by the old key.
- Verify
401for old tokens and successful access with new tokens. - Record rotation timestamp and owner in your runbook/audit log.
For emergency rotation, follow the same flow immediately and shorten token TTL while rotating.
Workflow: .github/workflows/security.yml
govulncheckfor Go dependency/code vulnerabilities- Trivy image scanning for container OS/library vulnerabilities
- PR/build fails on unresolved CRITICAL image findings