step1-password-proof.mjs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. * Phase 2 local proof: password sign-up + sign-in + session on Doltgres.
  3. *
  4. * cd apps/api
  5. * BRIVEN_ENGINE_DATABASE_URL=postgres://postgres:devpass@127.0.0.1:5434/briven_engine?sslmode=disable \
  6. * BRIVEN_DATA_PLANE_URL=postgres://postgres:devpass@127.0.0.1:5434/postgres?sslmode=disable \
  7. * BRIVEN_AUTH_CORE_ENABLED=true \
  8. * bun scripts/step1-password-proof.mjs
  9. */
  10. import pg from 'pg';
  11. // Set env BEFORE importing engine modules that read env at load.
  12. process.env.BRIVEN_AUTH_CORE_ENABLED = process.env.BRIVEN_AUTH_CORE_ENABLED ?? 'true';
  13. process.env.BRIVEN_ENGINE_DATABASE_URL =
  14. process.env.BRIVEN_ENGINE_DATABASE_URL ??
  15. 'postgres://postgres:devpass@127.0.0.1:5434/briven_engine?sslmode=disable';
  16. process.env.BRIVEN_DATA_PLANE_URL =
  17. process.env.BRIVEN_DATA_PLANE_URL ??
  18. 'postgres://postgres:devpass@127.0.0.1:5434/postgres?sslmode=disable';
  19. process.env.BRIVEN_ENV = process.env.BRIVEN_ENV ?? 'development';
  20. const { ensureBrivenEngineDatabase } = await import(
  21. '../src/services/auth-core/ensure-db.ts'
  22. );
  23. const { initAuthCoreSdk, probeBrivenEngine } = await import(
  24. '../src/services/auth-core/engine.ts'
  25. );
  26. const { signUpEmailPassword, signInEmailPassword } = await import(
  27. '../src/services/auth-core/emailpassword.ts'
  28. );
  29. const { createEngineSession, getSessionByHandle } = await import(
  30. '../src/services/auth-core/native-session.ts'
  31. );
  32. const { getEnginePool } = await import('../src/services/auth-core/db.ts');
  33. const email = `step1_${Date.now()}@example.com`;
  34. const password = 'Step1Test!Pass99';
  35. const projectId = 'p_step1_local';
  36. console.log('=== Step 1: password login on Doltgres ===');
  37. console.log('engine DB', process.env.BRIVEN_ENGINE_DATABASE_URL);
  38. console.log('email', email);
  39. console.log('project', projectId);
  40. // 1) Ensure database exists on Doltgres
  41. const ensured = await ensureBrivenEngineDatabase();
  42. console.log('ensure DB', ensured);
  43. if (!ensured.ok) {
  44. console.error('FAIL ensure DB');
  45. process.exit(1);
  46. }
  47. if (ensured.host !== 'doltgres' && !String(process.env.BRIVEN_ENGINE_DATABASE_URL).includes('5434')) {
  48. console.warn('warn: host check', ensured.host);
  49. }
  50. // 2) Init schema + pool
  51. const ok = await initAuthCoreSdk();
  52. console.log('init engine', ok);
  53. if (!ok) {
  54. console.error('FAIL init');
  55. process.exit(1);
  56. }
  57. const probe = await probeBrivenEngine();
  58. console.log('probe', {
  59. ok: probe.ok,
  60. storage: probe.storage,
  61. message: probe.message,
  62. schemaReady: probe.schemaReady,
  63. });
  64. if (!probe.ok) {
  65. console.error('FAIL probe');
  66. process.exit(1);
  67. }
  68. // 3) Sign up
  69. const signup = await signUpEmailPassword({
  70. email,
  71. password,
  72. projectId,
  73. });
  74. console.log('signup', signup);
  75. if (signup.status !== 'OK') {
  76. console.error('FAIL signup');
  77. process.exit(1);
  78. }
  79. // 4) Sign in
  80. const signin = await signInEmailPassword({
  81. email,
  82. password,
  83. projectId,
  84. });
  85. console.log('signin', signin);
  86. if (signin.status !== 'OK') {
  87. console.error('FAIL signin');
  88. process.exit(1);
  89. }
  90. // 5) Wrong password must fail
  91. const bad = await signInEmailPassword({
  92. email,
  93. password: 'wrong-password',
  94. projectId,
  95. });
  96. console.log('wrong password', bad.status);
  97. if (bad.status === 'OK') {
  98. console.error('FAIL: wrong password accepted');
  99. process.exit(1);
  100. }
  101. // 6) Session row on Doltgres
  102. const session = await createEngineSession({
  103. userId: signin.user.id,
  104. tenantId: signin.user.tenantId,
  105. });
  106. console.log('session handle', session.sessionHandle);
  107. // Phase 2: cookie value (accessToken) must equal handle for /session/me
  108. if (session.accessToken !== session.sessionHandle) {
  109. console.error('FAIL: accessToken must equal sessionHandle for cookie lookup');
  110. process.exit(1);
  111. }
  112. const loaded = await getSessionByHandle(session.sessionHandle);
  113. console.log('session loaded', loaded);
  114. if (!loaded || loaded.userId !== signin.user.id) {
  115. console.error('FAIL session not in Doltgres');
  116. process.exit(1);
  117. }
  118. // Cookie-style extract + verify (no HTTP server)
  119. const { extractSessionHandle } = await import(
  120. '../src/services/auth-core/session.ts'
  121. );
  122. const fromCookie = extractSessionHandle({
  123. cookieHeader: `sAccessToken=${encodeURIComponent(session.sessionHandle)}`,
  124. });
  125. if (fromCookie !== session.sessionHandle) {
  126. console.error('FAIL cookie extract', fromCookie);
  127. process.exit(1);
  128. }
  129. // 7) Direct SQL proof
  130. const pool = getEnginePool();
  131. const users = await pool.query(
  132. `SELECT id, email, tenant_id FROM be_users WHERE email = $1`,
  133. [email],
  134. );
  135. const sessions = await pool.query(
  136. `SELECT session_handle, user_id FROM be_sessions WHERE user_id = $1`,
  137. [signin.user.id],
  138. );
  139. console.log('SQL users', users.rows);
  140. console.log('SQL sessions count', sessions.rowCount, sessions.rows);
  141. // Refuse if somehow not on expected local doltgres port (localhost proof)
  142. const host = new URL(process.env.BRIVEN_ENGINE_DATABASE_URL).hostname;
  143. if (host === 'postgres') {
  144. console.error('FAIL: stock postgres host forbidden');
  145. process.exit(1);
  146. }
  147. console.log('');
  148. console.log('✔ PHASE 2 LOCAL PROOF OK');
  149. console.log(' storage: Doltgres (briven_engine)');
  150. console.log(' sign-up: OK');
  151. console.log(' sign-in: OK');
  152. console.log(' wrong password rejected: OK');
  153. console.log(' session row: OK');
  154. console.log(' cookie handle = session handle: OK');
  155. console.log(' userId:', signin.user.id);
  156. console.log(' tenantId:', signin.user.tenantId);
  157. process.exit(0);