template-monorepo/test/k6/lib/member.js

47 lines
1.5 KiB
JavaScript
Raw Normal View History

2026-05-27 09:28:13 +00:00
// Member flow helpers — TOTP enroll / step-up / change password.
2026-05-26 17:10:32 +00:00
import { post, checkEnvelope } from './http.js';
import { generateTOTP } from './totp.js';
2026-05-27 09:28:13 +00:00
export function verifyTOTPForPasswordChange(bearer, otpauthUrl, totpCode) {
const code = totpCode || generateTOTP(otpauthUrl);
const data = checkEnvelope(
post(
'/api/v1/members/me/totp/verify',
{ code, purpose: 'change_password' },
bearer,
),
'POST /me/totp/verify (change_password)',
).data;
if (!data.step_up_token) {
throw new Error('verify: missing step_up_token');
}
return data.step_up_token;
}
2026-05-26 17:10:32 +00:00
export function enrollTOTP(bearer) {
const enroll = checkEnvelope(
post('/api/v1/members/me/totp/enroll-start', null, bearer),
'POST /me/totp/enroll-start',
).data;
if (!enroll.otpauth_url) {
throw new Error('enroll-start: missing otpauth_url');
}
const code = generateTOTP(enroll.otpauth_url);
checkEnvelope(
post('/api/v1/members/me/totp/enroll-confirm', { code }, bearer),
'POST /me/totp/enroll-confirm',
);
return { otpauthUrl: enroll.otpauth_url };
}
2026-05-27 09:28:13 +00:00
export function changePassword(currentPassword, newPassword, bearer, opts = {}) {
const body = {
current_password: currentPassword,
new_password: newPassword,
};
if (opts.stepUpToken) body.step_up_token = opts.stepUpToken;
if (opts.totpCode) body.totp_code = opts.totpCode;
const res = post('/api/v1/members/me/password', body, bearer);
2026-05-26 17:10:32 +00:00
return checkEnvelope(res, 'POST /me/password').data;
}