1
0
forked from baron/baron-sso

fix userfront verify link routing

This commit is contained in:
2026-05-21 19:35:45 +09:00
parent 9fc6459636
commit dc68b7da41
9 changed files with 330 additions and 20 deletions

View File

@@ -252,9 +252,8 @@ test.describe('UserFront WASM auth routing', () => {
await page.goto('/ko/l/AB123456');
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);
await expect.poll(() => verifyRequests.length, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
expect(verifyRequests[0].path).toContain(
'/api/v1/auth/login/code/verify-short',
@@ -270,7 +269,7 @@ test.describe('UserFront WASM auth routing', () => {
});
await page.waitForTimeout(300);
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
await expect(page).not.toHaveURL(/\/signin(?:\?.*)?$/);
expect(clientFailures).toEqual([]);
});
@@ -295,8 +294,8 @@ test.describe('UserFront WASM auth routing', () => {
await page.goto('/ko/l/AB123456');
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);
await expect.poll(() => verifyCalls, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
const viewport = page.viewportSize();
@@ -311,11 +310,85 @@ test.describe('UserFront WASM auth routing', () => {
await page.waitForTimeout(300);
expect(userMeCalls).toBe(0);
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
await expect(page).not.toHaveURL(/\/signin(?:\?.*)?$/);
expect(clientFailures).toEqual([]);
});
test('루트/로그인에 붙은 인증 payload는 전용 verify 라우트에서만 소비하고 완료 URL을 정리한다', async ({
page,
}) => {
let userMeCalls = 0;
const verifyRequests: Array<{
path: string;
body: Record<string, unknown>;
}> = [];
const clientFailures = collectClientFailures(page);
await mockUserfrontApis(page, {
sessionStatus: 401,
captureUserMe: () => {
userMeCalls += 1;
},
captureVerify: (path, body) => {
verifyRequests.push({ path, body });
},
});
await page.goto(
'/?loginId=e2e%40example.com&code=654321&pendingRef=pending-root&utm=drop',
);
await expect.poll(() => verifyRequests.length, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
expect(verifyRequests[0].path).toContain('/api/v1/auth/login/code/verify');
expect(verifyRequests[0].body).toMatchObject({
loginId: 'e2e@example.com',
code: '654321',
pendingRef: 'pending-root',
verifyOnly: true,
});
expect(page.url()).not.toContain('loginId=');
expect(page.url()).not.toContain('code=');
expect(page.url()).not.toContain('pendingRef=');
expect(page.url()).not.toContain('utm=');
expect(clientFailures).toEqual([]);
});
test('로그인 페이지에 붙은 인증 payload도 전용 verify 라우트로 넘긴다', async ({
page,
}) => {
let userMeCalls = 0;
const verifyRequests: Array<{
path: string;
body: Record<string, unknown>;
}> = [];
const clientFailures = collectClientFailures(page);
await mockUserfrontApis(page, {
sessionStatus: 401,
captureUserMe: () => {
userMeCalls += 1;
},
captureVerify: (path, body) => {
verifyRequests.push({ path, body });
},
});
await page.goto('/ko/signin?loginId=e2e%40example.com&code=999999');
await expect.poll(() => verifyRequests.length, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
expect(verifyRequests[0].body).toMatchObject({
loginId: 'e2e@example.com',
code: '999999',
verifyOnly: true,
});
expect(page.url()).not.toContain('loginId=');
expect(page.url()).not.toContain('code=');
expect(clientFailures).toEqual([]);
});
test('verifyOnly 승인 링크를 팝업에서 닫으면 창만 닫히고 부모는 이동하지 않는다', async ({
page,
}, testInfo) => {
@@ -346,8 +419,8 @@ test.describe('UserFront WASM auth routing', () => {
}, popupURL);
const popup = await popupPromise;
await expect(popup).toHaveURL(/\/ko\/l\/AB123456$/);
await expect.poll(() => verifyCalls, { timeout: 10_000 }).toBe(1);
await expect(popup).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
const viewport = popup.viewportSize();
@@ -390,8 +463,8 @@ test.describe('UserFront WASM auth routing', () => {
await page.goto('/ko/verify/e2e-email-token');
await expect(page).toHaveURL(/\/ko\/verify\/e2e-email-token$/);
await expect.poll(() => verifyRequests.length, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
expect(verifyRequests[0].path).toContain('/api/v1/auth/magic-link/verify');
expect(verifyRequests[0].body).toMatchObject({
@@ -411,7 +484,7 @@ test.describe('UserFront WASM auth routing', () => {
await page.waitForTimeout(300);
expect(userMeCalls).toBe(0);
await expect(page).toHaveURL(/\/ko\/verify\/e2e-email-token$/);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
await expect(page).not.toHaveURL(/\/signin(?:\?.*)?$/);
expect(clientFailures).toEqual([]);
});
@@ -441,10 +514,8 @@ test.describe('UserFront WASM auth routing', () => {
'/ko/verify?loginId=e2e%40example.com&code=654321&pendingRef=pending-email',
);
await expect(page).toHaveURL(
/\/ko\/verify\?loginId=e2e(?:%40|@)example\.com&code=654321&pendingRef=pending-email$/,
);
await expect.poll(() => verifyRequests.length, { timeout: 10_000 }).toBe(1);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
expect(userMeCalls).toBe(0);
expect(verifyRequests[0].path).toContain('/api/v1/auth/login/code/verify');
expect(verifyRequests[0].body).toMatchObject({
@@ -466,9 +537,7 @@ test.describe('UserFront WASM auth routing', () => {
await page.waitForTimeout(300);
expect(userMeCalls).toBe(0);
await expect(page).toHaveURL(
/\/ko\/verify\?loginId=e2e(?:%40|@)example\.com&code=654321&pendingRef=pending-email$/,
);
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
await expect(page).not.toHaveURL(/\/signin(?:\?.*)?$/);
expect(clientFailures).toEqual([]);
});

View File

@@ -226,6 +226,11 @@ test.describe('UserFront WASM route inventory (unauth)', () => {
await expect(page).toHaveURL(/\/ko\/verification$/);
});
test('route: /ko/verify-complete', async ({ page }) => {
await page.goto('/ko/verify-complete');
await expect(page).toHaveURL(/\/ko\/verify-complete$/);
});
test('route: /ko/l/:shortCode', async ({ page }) => {
await page.goto('/ko/l/AB123456');
await expect(page).toHaveURL(/\/ko\/l\/AB123456$/);