feat: add internal API key for rSpace service-to-service auth

pushShapesToCanvas now sends X-Internal-Key header from
RSPACE_INTERNAL_KEY env var for authenticated canvas writes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-13 15:02:20 -07:00
parent 5575be9290
commit d64d8a0d57
2 changed files with 9 additions and 1 deletions

View File

@ -10,6 +10,7 @@ services:
- NEXT_PUBLIC_RSPACE_URL=${NEXT_PUBLIC_RSPACE_URL:-https://rspace.online} - NEXT_PUBLIC_RSPACE_URL=${NEXT_PUBLIC_RSPACE_URL:-https://rspace.online}
- RSPACE_INTERNAL_URL=${RSPACE_INTERNAL_URL:-http://rspace-online:3000} - RSPACE_INTERNAL_URL=${RSPACE_INTERNAL_URL:-http://rspace-online:3000}
- NEXT_PUBLIC_ENCRYPTID_SERVER_URL=${NEXT_PUBLIC_ENCRYPTID_SERVER_URL:-https://encryptid.jeffemmett.com} - NEXT_PUBLIC_ENCRYPTID_SERVER_URL=${NEXT_PUBLIC_ENCRYPTID_SERVER_URL:-https://encryptid.jeffemmett.com}
- RSPACE_INTERNAL_KEY=${RSPACE_INTERNAL_KEY}
volumes: volumes:
- uploads_data:/app/uploads - uploads_data:/app/uploads
labels: labels:

View File

@ -23,10 +23,17 @@ export async function pushShapesToCanvas(
rspaceUrl?: string rspaceUrl?: string
): Promise<void> { ): Promise<void> {
const baseUrl = rspaceUrl || process.env.RSPACE_INTERNAL_URL || 'http://rspace-online:3000'; const baseUrl = rspaceUrl || process.env.RSPACE_INTERNAL_URL || 'http://rspace-online:3000';
const headers: Record<string, string> = { 'Content-Type': 'application/json' };
// Use internal API key for service-to-service auth
const internalKey = process.env.RSPACE_INTERNAL_KEY;
if (internalKey) {
headers['X-Internal-Key'] = internalKey;
}
const response = await fetch(`${baseUrl}/api/communities/${canvasSlug}/shapes`, { const response = await fetch(`${baseUrl}/api/communities/${canvasSlug}/shapes`, {
method: 'POST', method: 'POST',
headers: { 'Content-Type': 'application/json' }, headers,
body: JSON.stringify({ shapes }), body: JSON.stringify({ shapes }),
}); });