Skip to content

Commit 441b28c

Browse files
authored
Add support for 'feature_flags' claim (#25)
1 parent 9b666d8 commit 441b28c

File tree

6 files changed

+28
-1
lines changed

6 files changed

+28
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export const loader = (args: LoaderFunctionArgs) => authkitLoader(args);
147147
export function App() {
148148
// Retrieves the user from the session or returns `null` if no user is signed in
149149
// Other supported values include `sessionId`, `accessToken`, `organizationId`,
150-
// `role`, `permissions`, `entitlements`, and `impersonator`.
150+
// `role`, `permissions`, `entitlements`, `featureFlags`, and `impersonator`.
151151
const { user, signInUrl, signUpUrl } = useLoaderData<typeof loader>();
152152

153153
return (

src/auth.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ describe('auth', () => {
110110
role: 'admin' as string | undefined,
111111
permissions: ['read', 'write'] as string[] | undefined,
112112
entitlements: ['premium'] as string[] | undefined,
113+
featureFlags: ['flag-1', 'flag-2'] as string[] | undefined,
113114
impersonator: null,
114115
sealedSession: 'sealed-session-data',
115116
headers: {
@@ -340,6 +341,7 @@ describe('auth', () => {
340341
role: 'admin',
341342
permissions: ['read', 'write'],
342343
entitlements: ['feature-1', 'feature-2'],
344+
featureFlags: ['flag-1', 'flag-2'],
343345
exp: Date.now() / 1000 + 3600, // 1 hour from now
344346
iss: 'https://api.workos.com',
345347
};
@@ -361,6 +363,7 @@ describe('auth', () => {
361363
role: mockClaims.role,
362364
permissions: mockClaims.permissions,
363365
entitlements: mockClaims.entitlements,
366+
featureFlags: mockClaims.featureFlags,
364367
impersonator: mockSession.impersonator,
365368
accessToken: mockSession.accessToken,
366369
});
@@ -394,6 +397,7 @@ describe('auth', () => {
394397
role: 'admin',
395398
permissions: ['read', 'write'],
396399
entitlements: ['feature-1', 'feature-2'],
400+
featureFlags: ['flag-1', 'flag-2'],
397401
exp: Date.now() / 1000 - 3600, // 1 hour ago (expired)
398402
iss: 'https://api.workos.com',
399403
};
@@ -417,6 +421,7 @@ describe('auth', () => {
417421
role: mockClaims.role,
418422
permissions: mockClaims.permissions,
419423
entitlements: mockClaims.entitlements,
424+
featureFlags: mockClaims.featureFlags,
420425
impersonator: undefined,
421426
accessToken: mockSession.accessToken,
422427
});

src/auth.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export async function withAuth(args: LoaderFunctionArgs): Promise<UserInfo | NoU
4949
organizationId,
5050
permissions,
5151
entitlements,
52+
featureFlags,
5253
role,
5354
exp = 0,
5455
} = getClaimsFromAccessToken(session.accessToken);
@@ -66,6 +67,7 @@ export async function withAuth(args: LoaderFunctionArgs): Promise<UserInfo | NoU
6667
role,
6768
permissions,
6869
entitlements,
70+
featureFlags,
6971
impersonator: session.impersonator,
7072
accessToken: session.accessToken,
7173
};

src/interfaces.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export interface AccessToken {
5757
role?: string;
5858
permissions?: string[];
5959
entitlements?: string[];
60+
feature_flags?: string[];
6061
}
6162

6263
export interface UserInfo {
@@ -66,6 +67,7 @@ export interface UserInfo {
6667
role?: string;
6768
permissions?: string[];
6869
entitlements?: string[];
70+
featureFlags?: string[];
6971
impersonator?: Impersonator;
7072
accessToken: string;
7173
}
@@ -77,6 +79,7 @@ export interface NoUserInfo {
7779
role?: undefined;
7880
permissions?: undefined;
7981
entitlements?: undefined;
82+
featureFlags?: undefined;
8083
impersonator?: undefined;
8184
accessToken?: undefined;
8285
}
@@ -110,6 +113,7 @@ export interface AuthorizedData {
110113
role: string | null;
111114
permissions: string[];
112115
entitlements: string[];
116+
featureFlags: string[];
113117
impersonator: Impersonator | null;
114118
sealedSession: string;
115119
}
@@ -122,6 +126,7 @@ export interface UnauthorizedData {
122126
role: null;
123127
permissions: null;
124128
entitlements: null;
129+
featureFlags: null;
125130
impersonator: null;
126131
sealedSession: null;
127132
}

src/session.spec.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ describe('session', () => {
282282
organizationId: null,
283283
permissions: null,
284284
entitlements: null,
285+
featureFlags: null,
285286
role: null,
286287
sessionId: null,
287288
sealedSession: null,
@@ -352,6 +353,7 @@ describe('session', () => {
352353
role: 'admin',
353354
permissions: ['read', 'write'],
354355
entitlements: ['premium'],
356+
feature_flags: ['flag-1', 'flag-2'],
355357
});
356358
});
357359

@@ -400,6 +402,7 @@ describe('session', () => {
400402
organizationId: 'org-123',
401403
permissions: ['read', 'write'],
402404
entitlements: ['premium'],
405+
featureFlags: ['flag-1', 'flag-2'],
403406
role: 'admin',
404407
sessionId: 'test-session-id',
405408
sealedSession: 'encrypted-jwt',
@@ -506,6 +509,7 @@ describe('session', () => {
506509
role: null,
507510
permissions: [],
508511
entitlements: [],
512+
feature_flags: [],
509513
};
510514
}
511515
if (token === 'new.valid.token') {
@@ -515,6 +519,7 @@ describe('session', () => {
515519
role: 'user',
516520
permissions: ['read'],
517521
entitlements: ['basic'],
522+
feature_flags: ['flag-1'],
518523
};
519524
}
520525
return {}; // fallback
@@ -539,6 +544,7 @@ describe('session', () => {
539544
role: 'user',
540545
permissions: ['read'],
541546
entitlements: ['basic'],
547+
featureFlags: ['flag-1'],
542548
}),
543549
);
544550

@@ -659,6 +665,7 @@ describe('session', () => {
659665
role: 'user',
660666
permissions: ['read'],
661667
entitlements: ['basic'],
668+
feature_flags: ['flag-1'],
662669
});
663670
});
664671

@@ -683,6 +690,7 @@ describe('session', () => {
683690
role: 'user',
684691
permissions: ['read'],
685692
entitlements: ['basic'],
693+
featureFlags: ['flag-1'],
686694
impersonator: null,
687695
sealedSession: 'encrypted-jwt',
688696
headers: {

src/session.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ export async function refreshSession(request: Request, { organizationId }: { org
7373
role,
7474
permissions,
7575
entitlements,
76+
featureFlags,
7677
} = getClaimsFromAccessToken(accessToken);
7778

7879
return {
@@ -83,6 +84,7 @@ export async function refreshSession(request: Request, { organizationId }: { org
8384
role,
8485
permissions,
8586
entitlements,
87+
featureFlags,
8688
impersonator: session.impersonator || null,
8789
sealedSession: cookieSession.get('jwt'),
8890
headers: newSession.headers,
@@ -323,6 +325,7 @@ export async function authkitLoader<Data = unknown>(
323325
organizationId: null,
324326
permissions: null,
325327
entitlements: null,
328+
featureFlags: null,
326329
role: null,
327330
sessionId: null,
328331
sealedSession: null,
@@ -338,6 +341,7 @@ export async function authkitLoader<Data = unknown>(
338341
role = null,
339342
permissions = [],
340343
entitlements = [],
344+
featureFlags = [],
341345
} = getClaimsFromAccessToken(session.accessToken);
342346

343347
const cookieSession = await getSession(request.headers.get('Cookie'));
@@ -361,6 +365,7 @@ export async function authkitLoader<Data = unknown>(
361365
role,
362366
permissions,
363367
entitlements,
368+
featureFlags,
364369
impersonator,
365370
sealedSession: cookieSession.get('jwt'),
366371
};
@@ -473,6 +478,7 @@ export function getClaimsFromAccessToken(accessToken: string) {
473478
role,
474479
permissions,
475480
entitlements,
481+
feature_flags: featureFlags,
476482
exp,
477483
iss,
478484
} = decodeJwt<AccessToken>(accessToken);
@@ -485,6 +491,7 @@ export function getClaimsFromAccessToken(accessToken: string) {
485491
role,
486492
permissions,
487493
entitlements,
494+
featureFlags,
488495
};
489496
}
490497

0 commit comments

Comments
 (0)