forked from wangziqi/gongxue-base
120 lines
3.6 KiB
JavaScript
120 lines
3.6 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import http from 'node:http';
|
|
import { runRemoteAuthSmoke } from './remote-auth-jwt-smoke.js';
|
|
|
|
const tenantId = '00000000-0000-0000-0000-000000000001';
|
|
const wrongTenantId = '00000000-0000-0000-0000-000000000901';
|
|
|
|
function json(res, status, payload) {
|
|
res.writeHead(status, { 'content-type': 'application/json' });
|
|
res.end(JSON.stringify(payload));
|
|
}
|
|
|
|
function bearer(req) {
|
|
const header = req.headers.authorization || '';
|
|
return header.replace(/^Bearer\s+/i, '').trim();
|
|
}
|
|
|
|
function isWrongTenant(req) {
|
|
return req.headers['x-tenant-id'] === wrongTenantId;
|
|
}
|
|
|
|
const server = http.createServer((req, res) => {
|
|
const token = bearer(req);
|
|
const url = new URL(req.url || '/', 'http://127.0.0.1');
|
|
|
|
if (token === 'invalid.jwt.token') {
|
|
json(res, 401, { code: 'AUTH_SESSION_INVALID' });
|
|
return;
|
|
}
|
|
|
|
if (isWrongTenant(req) && url.pathname === '/api/profile/me') {
|
|
json(res, 401, { code: 'AUTH_SESSION_INVALID' });
|
|
return;
|
|
}
|
|
|
|
if (token === 'student-token') {
|
|
if (url.pathname === '/api/auth/me') {
|
|
json(res, 200, { user: { id: 'student-user' }, session: { source: 'supabase_jwt' } });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/profile/me') {
|
|
json(res, 200, { item: { userId: 'student-user' } });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/tenant-admin/overview') {
|
|
json(res, 403, { code: 'TENANT_ADMIN_REQUIRED' });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/platform-admin/overview') {
|
|
json(res, 403, { code: 'PLATFORM_ADMIN_REQUIRED' });
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (token === 'tenant-token') {
|
|
if (url.pathname === '/api/auth/me') {
|
|
json(res, 200, { user: { id: 'tenant-user' }, session: { source: 'supabase_jwt' } });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/tenant-admin/overview') {
|
|
json(res, 200, { item: { id: tenantId } });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/platform-admin/overview') {
|
|
json(res, 403, { code: 'PLATFORM_ADMIN_REQUIRED' });
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (token === 'platform-token') {
|
|
if (url.pathname === '/api/platform-admin/overview') {
|
|
json(res, 200, { item: { tenants: { total: 2 } } });
|
|
return;
|
|
}
|
|
if (url.pathname === '/api/auth/me') {
|
|
json(res, 200, { user: { id: 'platform-user' }, session: { source: 'supabase_jwt' } });
|
|
return;
|
|
}
|
|
}
|
|
|
|
json(res, 404, { code: 'NOT_FOUND', path: url.pathname });
|
|
});
|
|
|
|
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
|
|
|
|
try {
|
|
const address = server.address();
|
|
const results = await runRemoteAuthSmoke(
|
|
{
|
|
apiBaseUrl: `http://127.0.0.1:${address.port}`,
|
|
tenantId,
|
|
wrongTenantId,
|
|
timeoutMs: 5000,
|
|
requireAdminTokens: true,
|
|
student: {
|
|
token: 'student-token',
|
|
expectedUserId: 'student-user',
|
|
},
|
|
tenantAdmin: {
|
|
token: 'tenant-token',
|
|
expectedUserId: 'tenant-user',
|
|
},
|
|
platformAdmin: {
|
|
token: 'platform-token',
|
|
expectedUserId: 'platform-user',
|
|
tenantId,
|
|
},
|
|
},
|
|
{ quiet: true },
|
|
);
|
|
|
|
assert.equal(results.some(item => item.name === 'student.auth_me.session_source' && item.status === 'pass'), true);
|
|
assert.equal(results.some(item => item.name === 'student.tenant_admin_denied' && item.status === 'pass'), true);
|
|
assert.equal(results.some(item => item.name === 'platform_admin.overview' && item.status === 'pass'), true);
|
|
assert.equal(results.filter(item => item.status === 'fail').length, 0);
|
|
console.log('[PASS] remote Auth/JWKS smoke script');
|
|
} finally {
|
|
await new Promise(resolve => server.close(resolve));
|
|
}
|