Skip to content

Commit 905f6a3

Browse files
committed
feat(auth): add TypeScript types for documented JWT claims fields
- Added type safety for email, phone, user_metadata, app_metadata, is_anonymous, etc. - Provides autocomplete and type safety for all documented JWT claims fields - getClaims() method now returns properly typed JwtPayload with documented fields Fixes #1584
1 parent 46abe0d commit 905f6a3

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

packages/core/auth-js/src/lib/types.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1434,7 +1434,21 @@ export type RequiredClaims = {
14341434
session_id: string
14351435
}
14361436

1437-
export type JwtPayload = RequiredClaims & {
1437+
export interface JwtPayload extends RequiredClaims {
1438+
email?: string
1439+
phone?: string
1440+
user_metadata?: UserMetadata
1441+
app_metadata?: UserAppMetadata
1442+
is_anonymous?: boolean
1443+
is_sso_user?: boolean
1444+
id?: string
1445+
created_at?: string
1446+
updated_at?: string
1447+
confirmed_at?: string
1448+
email_confirmed_at?: string
1449+
phone_confirmed_at?: string
1450+
last_sign_in_at?: string
1451+
identities?: UserIdentity[]
14381452
[key: string]: any
14391453
}
14401454

packages/core/auth-js/test/GoTrueClient.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1613,6 +1613,35 @@ describe('getClaims', () => {
16131613
expect(authWithSession.getUser).toHaveBeenCalled()
16141614
})
16151615

1616+
test('getClaims returns properly typed JwtPayload with documented fields', async () => {
1617+
const { email, password } = mockUserCredentials()
1618+
const {
1619+
data: { user },
1620+
error: initialError,
1621+
} = await authWithSession.signUp({
1622+
email,
1623+
password,
1624+
})
1625+
expect(initialError).toBeNull()
1626+
expect(user).not.toBeNull()
1627+
1628+
const { data, error } = await authWithSession.getClaims()
1629+
expect(error).toBeNull()
1630+
expect(data).not.toBeNull()
1631+
1632+
const claims = data?.claims
1633+
expect(claims).toBeDefined()
1634+
1635+
expect(typeof claims?.email).toBe('string')
1636+
expect(typeof claims?.user_metadata).toBe('object')
1637+
expect(typeof claims?.app_metadata).toBe('object')
1638+
expect(typeof claims?.is_anonymous).toBe('boolean')
1639+
expect(typeof claims?.is_sso_user).toBe('boolean')
1640+
expect(typeof claims?.id).toBe('string')
1641+
expect(typeof claims?.created_at).toBe('string')
1642+
expect(typeof claims?.role).toBe('string')
1643+
})
1644+
16161645
test('getClaims fetches JWKS to verify asymmetric jwt', async () => {
16171646
const fetchedUrls: any[] = []
16181647
const fetchedResponse: any[] = []

0 commit comments

Comments
 (0)