Files
root ccf48c8224
Deploy EG-BIM QA Gateway / deploy (push) Successful in 1m24s
fix: use supported redirect mode for Workers organization requests
2026-10-30 12:49:15 +09:00

51 lines
2.5 KiB
JavaScript

import worker from './index.js';
const ROOT = '038326b6-954a-48a7-a85f-efd83f62b82a';
const USER = '01900000-0000-7000-8000-000000000001';
const DEPT = 'ee2f39ac-fe52-4cfb-b4e3-4ae1d114c916';
const encoder = new TextEncoder();
const encode = (bytes) => btoa(String.fromCharCode(...bytes)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
function equal(actual, expected, field) {
if (actual !== expected) throw new Error(`${field}: expected ${expected}, received ${actual}`);
}
export default {
async test() {
const user = {
userUuid: USER, ssoSubject: USER, requesterId: USER,
tenantId: DEPT, requesterTenantId: DEPT,
company: 'IS3', companySource: 'sso', department: ''
};
const env = {
SESSION_COOKIE_NAME: 'fixture_session', SESSION_SECRET: 'fixture-session-secret',
ORG_CONTEXT_ENABLED: 'true', ORG_CONTEXT_API_URL: 'https://organization.example.test/org-context',
ORG_CONTEXT_KEY_ID: 'fixture-key-id', ORG_CONTEXT_KEY_SECRET: 'fixture-key-secret',
ORG_CONTEXT_TENANT_IDS: JSON.stringify([ROOT])
};
const payload = encode(encoder.encode(JSON.stringify({ user, expiresAt: Date.now() + 60000 })));
const key = await crypto.subtle.importKey('raw', encoder.encode(env.SESSION_SECRET), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
const signature = encode(new Uint8Array(await crypto.subtle.sign('HMAC', key, encoder.encode(payload))));
const request = () => new Request('https://qa.example.test/auth/session', {
headers: { cookie: `${env.SESSION_COOKIE_NAME}=${payload}.${signature}` }
});
const response = await worker.fetch(request(), env);
const session = await response.json();
equal(response.status, 200, 'session HTTP status');
equal(session.authenticated, true, 'authenticated');
equal(session.user.orgContextStatus, 'resolved', 'organization lookup');
equal(session.user.company, '총괄기획실&기술개발센터', 'company');
equal(session.user.department, 'IS3', 'department');
equal(session.user.requesterId, USER, 'canonical identity');
equal(session.user.orgContextError, undefined, 'error after success');
const rejected = await worker.fetch(request(), {
...env, ORG_CONTEXT_API_URL: 'https://organization.example.test/redirect'
});
const rejectedSession = await rejected.json();
equal(rejectedSession.authenticated, true, 'session after upstream redirect');
equal(rejectedSession.user.orgContextError, 'org_context_http_302', 'redirect rejection');
}
};