e7e99247e8
# Introduction Followup https://github.com/twentyhq/twenty/pull/21707 ## Behavioral change worth calling out Server-level impersonation now requires verified 2FA outside development at every checkpoint (generation, exchange, and per-request). In main the 2FA gate only existed in ImpersonationService. This is the right tightening, but it means existing server-admin impersonation sessions in production for admins without verified 2FA will now be rejected on the next request, not just at token creation. cc @s0yd4RK <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/twentyhq/twenty/pull/21717?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: s0yd4RK <285671363+s0yd4RK@users.noreply.github.com> Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
import request from 'supertest';
|
|
import { getAuthTokensFromLoginToken } from 'test/integration/graphql/utils/get-auth-tokens-from-login-token.util';
|
|
|
|
const SERVER_URL = `http://localhost:${APP_PORT}`;
|
|
|
|
const buildAppleOrigin = (): string => {
|
|
const origin = new URL(SERVER_URL);
|
|
|
|
origin.hostname =
|
|
process.env.IS_MULTIWORKSPACE_ENABLED === 'true'
|
|
? `apple.${origin.hostname}`
|
|
: origin.hostname;
|
|
|
|
return origin.toString();
|
|
};
|
|
|
|
type GetAccessTokenForCredentialsArgs = {
|
|
email: string;
|
|
password?: string;
|
|
};
|
|
|
|
// Logs a seeded Apple user in with email/password and returns a usable
|
|
// access token, minting it dynamically rather than relying on a pre-baked
|
|
// entry in test-tokens.json.
|
|
export const getAccessTokenForCredentials = async ({
|
|
email,
|
|
password = 'tim@apple.dev',
|
|
}: GetAccessTokenForCredentialsArgs): Promise<string> => {
|
|
const origin = buildAppleOrigin();
|
|
|
|
const loginResponse = await request(SERVER_URL)
|
|
.post('/metadata')
|
|
.set('Origin', origin)
|
|
.send({
|
|
query: `
|
|
mutation GetLoginTokenFromCredentials(
|
|
$email: String!
|
|
$password: String!
|
|
$origin: String!
|
|
) {
|
|
getLoginTokenFromCredentials(
|
|
email: $email
|
|
password: $password
|
|
origin: $origin
|
|
) {
|
|
loginToken {
|
|
token
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
variables: { email, password, origin },
|
|
})
|
|
.expect(200);
|
|
|
|
const loginToken =
|
|
loginResponse.body.data.getLoginTokenFromCredentials.loginToken.token;
|
|
|
|
const { data } = await getAuthTokensFromLoginToken({
|
|
loginToken,
|
|
origin,
|
|
expectToFail: false,
|
|
});
|
|
|
|
return data.getAuthTokensFromLoginToken.tokens.accessOrWorkspaceAgnosticToken
|
|
.token;
|
|
};
|