diff --git a/src/actions/actions.spec.ts b/src/actions/actions.spec.ts index 25af43269..128fcaae0 100644 --- a/src/actions/actions.spec.ts +++ b/src/actions/actions.spec.ts @@ -131,6 +131,7 @@ describe('Actions', () => { externalId: null, metadata: {}, }, + authenticationMethod: 'Password', ipAddress: '50.141.123.10', userAgent: 'Mozilla/5.0', deviceFingerprint: 'notafingerprint', @@ -183,6 +184,7 @@ describe('Actions', () => { firstName: 'Jane', lastName: 'Doe', }, + authenticationMethod: 'GoogleOAuth', ipAddress: '50.141.123.10', userAgent: 'Mozilla/5.0', deviceFingerprint: 'notafingerprint', @@ -197,5 +199,19 @@ describe('Actions', () => { }), }); }); + + it('leaves the authentication method undefined when the payload omits it', async () => { + const { authentication_method: _omitted, ...payload } = + mockAuthActionContext; + const sigHeader = makeSigHeader(payload, secret); + const action = await workos.actions.constructAction({ + payload, + sigHeader, + secret, + }); + + expect(action.authenticationMethod).toBeUndefined(); + expect(action.object).toEqual('authentication_action_context'); + }); }); }); diff --git a/src/actions/fixtures/authentication-action-context.json b/src/actions/fixtures/authentication-action-context.json index 3dd48e7de..addea1928 100644 --- a/src/actions/fixtures/authentication-action-context.json +++ b/src/actions/fixtures/authentication-action-context.json @@ -12,6 +12,7 @@ "created_at": "2024-10-22T17:12:50.746Z", "updated_at": "2024-10-22T17:12:50.746Z" }, + "authentication_method": "Password", "ip_address": "50.141.123.10", "user_agent": "Mozilla/5.0", "device_fingerprint": "notafingerprint", diff --git a/src/actions/fixtures/user-registration-action-context.json b/src/actions/fixtures/user-registration-action-context.json index bfd422a17..3fd36a96a 100644 --- a/src/actions/fixtures/user-registration-action-context.json +++ b/src/actions/fixtures/user-registration-action-context.json @@ -7,6 +7,7 @@ "first_name": "Jane", "last_name": "Doe" }, + "authentication_method": "GoogleOAuth", "ip_address": "50.141.123.10", "user_agent": "Mozilla/5.0", "device_fingerprint": "notafingerprint", diff --git a/src/actions/interfaces/action.interface.ts b/src/actions/interfaces/action.interface.ts index bf1df04c0..c25edc74a 100644 --- a/src/actions/interfaces/action.interface.ts +++ b/src/actions/interfaces/action.interface.ts @@ -3,6 +3,7 @@ import { OrganizationResponse, } from '../../organizations/interfaces'; import { + AuthenticationMethod, Invitation, InvitationResponse, OrganizationMembership, @@ -17,6 +18,7 @@ interface AuthenticationActionContext { user: User; organization?: Organization; organizationMembership?: OrganizationMembership; + authenticationMethod?: AuthenticationMethod; ipAddress?: string; userAgent?: string; deviceFingerprint?: string; @@ -36,6 +38,7 @@ interface UserRegistrationActionContext { object: 'user_registration_action_context'; userData: UserData; invitation?: Invitation; + authenticationMethod?: AuthenticationMethod; ipAddress?: string; userAgent?: string; deviceFingerprint?: string; @@ -50,6 +53,7 @@ interface AuthenticationActionPayload { user: UserResponse; organization?: OrganizationResponse; organization_membership?: OrganizationMembershipResponse; + authentication_method?: AuthenticationMethod; ip_address?: string; user_agent?: string; device_fingerprint?: string; @@ -69,6 +73,7 @@ export interface UserRegistrationActionPayload { object: 'user_registration_action_context'; user_data: UserDataPayload; invitation?: InvitationResponse; + authentication_method?: AuthenticationMethod; ip_address?: string; user_agent?: string; device_fingerprint?: string; diff --git a/src/actions/serializers/action.serializer.ts b/src/actions/serializers/action.serializer.ts index 1080249bc..ea62ccdf8 100644 --- a/src/actions/serializers/action.serializer.ts +++ b/src/actions/serializers/action.serializer.ts @@ -33,7 +33,7 @@ export const deserializeAction = ( invitation: actionPayload.invitation ? deserializeInvitation(actionPayload.invitation) : undefined, - + authenticationMethod: actionPayload.authentication_method, ipAddress: actionPayload.ip_address, userAgent: actionPayload.user_agent, deviceFingerprint: actionPayload.device_fingerprint, @@ -51,6 +51,7 @@ export const deserializeAction = ( actionPayload.organization_membership, ) : undefined, + authenticationMethod: actionPayload.authentication_method, ipAddress: actionPayload.ip_address, userAgent: actionPayload.user_agent, deviceFingerprint: actionPayload.device_fingerprint, diff --git a/src/user-management/interfaces/authentication-response.interface.ts b/src/user-management/interfaces/authentication-response.interface.ts index 3fe4d329c..ebdd63687 100644 --- a/src/user-management/interfaces/authentication-response.interface.ts +++ b/src/user-management/interfaces/authentication-response.interface.ts @@ -2,7 +2,7 @@ import { Impersonator, ImpersonatorResponse } from './impersonator.interface'; import { OauthTokens, OauthTokensResponse } from './oauth-tokens.interface'; import { User, UserResponse } from './user.interface'; -type AuthenticationMethod = +export type AuthenticationMethod = | 'SSO' | 'Password' | 'Passkey' @@ -12,6 +12,8 @@ type AuthenticationMethod = | 'GitHubOAuth' | 'GitLabOAuth' | 'GoogleOAuth' + | 'GrokOAuth' + | 'XOAuth' | 'IntuitOAuth' | 'LinkedInOAuth' | 'MicrosoftOAuth'