mirror of
https://github.com/documenso/documenso.git
synced 2025-11-13 00:03:33 +10:00
## Description Add the following document action auth options: - 2FA - Passkey If the user does not have the required auth setup, we onboard them directly. ## Changes made Note: Added secondaryId to the VerificationToken schema ## Testing Performed Tested locally, pending preview tests ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [X] I have followed the project's coding style guidelines. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced components for 2FA, account, and passkey authentication during document signing. - Added "Require passkey" option to document settings and signer authentication settings. - Enhanced form submission and loading states for improved user experience. - **Refactor** - Optimized authentication components to efficiently support multiple authentication methods. - **Chores** - Updated and renamed functions and components for clarity and consistency across the authentication system. - Refined sorting options and database schema to support new authentication features. - **Bug Fixes** - Adjusted SignInForm to verify browser support for WebAuthn before proceeding. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
42 lines
1016 B
TypeScript
42 lines
1016 B
TypeScript
import { generateAuthenticationOptions } from '@simplewebauthn/server';
|
|
import { DateTime } from 'luxon';
|
|
|
|
import { prisma } from '@documenso/prisma';
|
|
|
|
import { getAuthenticatorOptions } from '../../utils/authenticator';
|
|
|
|
type CreatePasskeySigninOptions = {
|
|
sessionId: string;
|
|
};
|
|
|
|
export const createPasskeySigninOptions = async ({ sessionId }: CreatePasskeySigninOptions) => {
|
|
const { rpId, timeout } = getAuthenticatorOptions();
|
|
|
|
const options = await generateAuthenticationOptions({
|
|
rpID: rpId,
|
|
userVerification: 'preferred',
|
|
timeout,
|
|
});
|
|
|
|
const { challenge } = options;
|
|
|
|
await prisma.anonymousVerificationToken.upsert({
|
|
where: {
|
|
id: sessionId,
|
|
},
|
|
update: {
|
|
token: challenge,
|
|
expiresAt: DateTime.now().plus({ minutes: 2 }).toJSDate(),
|
|
createdAt: new Date(),
|
|
},
|
|
create: {
|
|
id: sessionId,
|
|
token: challenge,
|
|
expiresAt: DateTime.now().plus({ minutes: 2 }).toJSDate(),
|
|
createdAt: new Date(),
|
|
},
|
|
});
|
|
|
|
return options;
|
|
};
|