Skip to content

Commit 22b8e49

Browse files
feat(clerk-js,backend,types): Add enterprise_sso for session reverification (#6954)
Co-authored-by: Nicolas Lopes <nicolas@clerk.dev>
1 parent 1a2eee6 commit 22b8e49

File tree

12 files changed

+60
-4
lines changed

12 files changed

+60
-4
lines changed

.changeset/plenty-shirts-tease.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@clerk/backend': patch
3+
---
4+
5+
Add `last_authenticated_at` to `SAMLAccount` resource, which represents the date when the SAML account was last authenticated

.changeset/thick-jokes-talk.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@clerk/clerk-js': patch
3+
'@clerk/types': patch
4+
---
5+
6+
- Add experimental property `last_authenticated_at` to `SamlAccount` resource, which represents the date when the SAML account was last authenticated
7+
- Add experimental support for `enterprise_sso` as a `strategy` param for `session.prepareFirstFactorVerification`

packages/backend/src/api/resources/JSON.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ export interface SamlAccountJSON extends ClerkResourceJSON {
246246
last_name: string;
247247
verification: VerificationJSON | null;
248248
saml_connection: SamlAccountConnectionJSON | null;
249+
last_authenticated_at: number | null;
249250
}
250251

251252
export interface IdentificationLinkJSON extends ClerkResourceJSON {

packages/backend/src/api/resources/SamlAccount.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ export class SamlAccount {
4343
* The SAML connection of the SAML account.
4444
*/
4545
readonly samlConnection: SamlAccountConnection | null,
46+
/**
47+
* The date when the SAML account was last authenticated.
48+
*/
49+
readonly lastAuthenticatedAt: number | null,
4650
) {}
4751

4852
static fromJSON(data: SamlAccountJSON): SamlAccount {
@@ -56,6 +60,7 @@ export class SamlAccount {
5660
data.last_name,
5761
data.verification && Verification.fromJSON(data.verification),
5862
data.saml_connection && SamlAccountConnection.fromJSON(data.saml_connection),
63+
data.last_authenticated_at ?? null,
5964
);
6065
}
6166
}

packages/clerk-js/src/core/resources/EnterpriseAccount.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export class EnterpriseAccount extends BaseResource implements EnterpriseAccount
2424
publicMetadata = {};
2525
verification: VerificationResource | null = null;
2626
enterpriseConnection: EnterpriseAccountConnectionResource | null = null;
27+
lastAuthenticatedAt: Date | null = null;
2728

2829
public constructor(data: Partial<EnterpriseAccountJSON | EnterpriseAccountJSONSnapshot>, pathRoot: string);
2930
public constructor(data: EnterpriseAccountJSON | EnterpriseAccountJSONSnapshot, pathRoot: string) {
@@ -46,7 +47,7 @@ export class EnterpriseAccount extends BaseResource implements EnterpriseAccount
4647
this.firstName = data.first_name;
4748
this.lastName = data.last_name;
4849
this.publicMetadata = data.public_metadata;
49-
50+
this.lastAuthenticatedAt = data.last_authenticated_at ? unixEpochToDate(data.last_authenticated_at) : null;
5051
if (data.verification) {
5152
this.verification = new Verification(data.verification);
5253
}
@@ -72,6 +73,7 @@ export class EnterpriseAccount extends BaseResource implements EnterpriseAccount
7273
public_metadata: this.publicMetadata,
7374
verification: this.verification?.__internal_toSnapshot() || null,
7475
enterprise_connection: this.enterpriseConnection?.__internal_toSnapshot() || null,
76+
last_authenticated_at: this.lastAuthenticatedAt ? this.lastAuthenticatedAt.getTime() : null,
7577
};
7678
}
7779
}

packages/clerk-js/src/core/resources/SamlAccount.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class SamlAccount extends BaseResource implements SamlAccountResource {
2323
lastName = '';
2424
verification: VerificationResource | null = null;
2525
samlConnection: SamlAccountConnectionResource | null = null;
26+
lastAuthenticatedAt: Date | null = null;
2627

2728
public constructor(data: Partial<SamlAccountJSON | SamlAccountJSONSnapshot>, pathRoot: string);
2829
public constructor(data: SamlAccountJSON | SamlAccountJSONSnapshot, pathRoot: string) {
@@ -52,6 +53,8 @@ export class SamlAccount extends BaseResource implements SamlAccountResource {
5253
this.samlConnection = new SamlAccountConnection(data.saml_connection);
5354
}
5455

56+
this.lastAuthenticatedAt = data.last_authenticated_at ? unixEpochToDate(data.last_authenticated_at) : null;
57+
5558
return this;
5659
}
5760

@@ -67,6 +70,7 @@ export class SamlAccount extends BaseResource implements SamlAccountResource {
6770
last_name: this.lastName,
6871
verification: this.verification?.__internal_toSnapshot() || null,
6972
saml_connection: this.samlConnection?.__internal_toSnapshot(),
73+
last_authenticated_at: this.lastAuthenticatedAt ? this.lastAuthenticatedAt.getTime() : null,
7074
};
7175
}
7276
}

packages/clerk-js/src/core/resources/Session.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
ActClaim,
77
CheckAuthorization,
88
EmailCodeConfig,
9+
EnterpriseSSOConfig,
910
GetToken,
1011
GetTokenOptions,
1112
PhoneCodeConfig,
@@ -179,6 +180,13 @@ export class Session extends BaseResource implements SessionResource {
179180
case 'passkey':
180181
config = {};
181182
break;
183+
case 'enterprise_sso':
184+
config = {
185+
emailAddressId: factor.emailAddressId,
186+
enterpriseConnectionId: factor.enterpriseConnectionId,
187+
redirectUrl: factor.redirectUrl,
188+
} as EnterpriseSSOConfig;
189+
break;
182190
default:
183191
clerkInvalidStrategy('Session.prepareFirstFactorVerification', (factor as any).strategy);
184192
}

packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { formatSafeIdentifier } from '@/ui/utils/formatSafeIdentifier';
1010
import type { LocalizationKey } from '../../customizables';
1111
import { Col, descriptors, Flex, Flow, localizationKeys } from '../../customizables';
1212
import { useCardState } from '../../elements/contexts';
13-
import { ChatAltIcon, Email, Fingerprint, LockClosedIcon } from '../../icons';
13+
import { ChatAltIcon, Email, Fingerprint, LockClosedIcon, Organization } from '../../icons';
1414
import { useReverificationAlternativeStrategies } from './useReverificationAlternativeStrategies';
1515
import { useUserVerificationSession } from './useUserVerificationSession';
1616
import { withHavingTrouble } from './withHavingTrouble';
@@ -128,6 +128,7 @@ export function getButtonIcon(factor: SessionVerificationFirstFactor) {
128128
phone_code: ChatAltIcon,
129129
password: LockClosedIcon,
130130
passkey: Fingerprint,
131+
enterprise_sso: Organization,
131132
} as const;
132133

133134
return icons[factor.strategy];

packages/types/src/factors.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ export type EnterpriseSSOConfig = EnterpriseSSOFactor & {
124124
redirectUrl: string;
125125
actionCompleteRedirectUrl: string;
126126
oidcPrompt?: string;
127+
/**
128+
* @experimental
129+
*/
130+
emailAddressId?: string;
127131
/**
128132
* @experimental
129133
*/

packages/types/src/json.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ export interface EnterpriseAccountJSON extends ClerkResourceJSON {
252252
provider_user_id: string | null;
253253
public_metadata: Record<string, unknown>;
254254
verification: VerificationJSON | null;
255+
last_authenticated_at: number | null;
255256
}
256257

257258
export interface EnterpriseAccountConnectionJSON extends ClerkResourceJSON {
@@ -279,6 +280,7 @@ export interface SamlAccountJSON extends ClerkResourceJSON {
279280
last_name: string;
280281
verification?: VerificationJSON;
281282
saml_connection?: SamlAccountConnectionJSON;
283+
last_authenticated_at: number | null;
282284
}
283285

284286
export interface UserJSON extends ClerkResourceJSON {

0 commit comments

Comments
 (0)