@xbg.solutions/bpsk-utils-firebase-auth 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +13 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +20 -0
- package/lib/index.js.map +1 -0
- package/lib/services/auth/auth.service.d.ts +89 -0
- package/lib/services/auth/auth.service.d.ts.map +1 -0
- package/lib/services/auth/auth.service.js +615 -0
- package/lib/services/auth/auth.service.js.map +1 -0
- package/lib/services/auth/email-link.d.ts +99 -0
- package/lib/services/auth/email-link.d.ts.map +1 -0
- package/lib/services/auth/email-link.js +715 -0
- package/lib/services/auth/email-link.js.map +1 -0
- package/lib/services/auth/index.d.ts +15 -0
- package/lib/services/auth/index.d.ts.map +1 -0
- package/lib/services/auth/index.js +18 -0
- package/lib/services/auth/index.js.map +1 -0
- package/lib/services/auth/phone-auth.d.ts +65 -0
- package/lib/services/auth/phone-auth.d.ts.map +1 -0
- package/lib/services/auth/phone-auth.js +150 -0
- package/lib/services/auth/phone-auth.js.map +1 -0
- package/lib/services/auth/user-creation.d.ts +17 -0
- package/lib/services/auth/user-creation.d.ts.map +1 -0
- package/lib/services/auth/user-creation.js +39 -0
- package/lib/services/auth/user-creation.js.map +1 -0
- package/lib/services/token/index.d.ts +29 -0
- package/lib/services/token/index.d.ts.map +1 -0
- package/lib/services/token/index.js +20 -0
- package/lib/services/token/index.js.map +1 -0
- package/lib/services/token/token.service.d.ts +57 -0
- package/lib/services/token/token.service.d.ts.map +1 -0
- package/lib/services/token/token.service.js +554 -0
- package/lib/services/token/token.service.js.map +1 -0
- package/lib/stores/auth.service.d.ts +6 -0
- package/lib/stores/auth.service.d.ts.map +1 -0
- package/lib/stores/auth.service.js +6 -0
- package/lib/stores/auth.service.js.map +1 -0
- package/lib/stores/auth.store.d.ts +56 -0
- package/lib/stores/auth.store.d.ts.map +1 -0
- package/lib/stores/auth.store.js +64 -0
- package/lib/stores/auth.store.js.map +1 -0
- package/lib/stores/token.store.d.ts +41 -0
- package/lib/stores/token.store.d.ts.map +1 -0
- package/lib/stores/token.store.js +36 -0
- package/lib/stores/token.store.js.map +1 -0
- package/lib/stores/user-creation.d.ts +8 -0
- package/lib/stores/user-creation.d.ts.map +1 -0
- package/lib/stores/user-creation.js +11 -0
- package/lib/stores/user-creation.js.map +1 -0
- package/lib/utils/auth-guard.d.ts +58 -0
- package/lib/utils/auth-guard.d.ts.map +1 -0
- package/lib/utils/auth-guard.js +109 -0
- package/lib/utils/auth-guard.js.map +1 -0
- package/lib/utils/signout.d.ts +82 -0
- package/lib/utils/signout.d.ts.map +1 -0
- package/lib/utils/signout.js +168 -0
- package/lib/utils/signout.js.map +1 -0
- package/lib/utils/tokens.d.ts +136 -0
- package/lib/utils/tokens.d.ts.map +1 -0
- package/lib/utils/tokens.js +479 -0
- package/lib/utils/tokens.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/lib/utils/tokens.ts
|
|
3
|
+
* Token Utilities
|
|
4
|
+
*
|
|
5
|
+
* Utilities for working with JWT tokens, including:
|
|
6
|
+
* - Decoding and parsing tokens
|
|
7
|
+
* - Extracting claims and roles
|
|
8
|
+
* - Token validation and expiration checking
|
|
9
|
+
* - Token storage and retrieval
|
|
10
|
+
*
|
|
11
|
+
* NOTE: The key improvements here are in the extractClaims function,
|
|
12
|
+
* which now properly handles Firebase's JWT format and ensures
|
|
13
|
+
* boolean values are correctly interpreted.
|
|
14
|
+
*/
|
|
15
|
+
import { AppError } from '@xbg.solutions/bpsk-core';
|
|
16
|
+
import type { DecodedToken, TokenOptions, TokenRole, FirebaseUserClaims } from '@xbg.solutions/bpsk-core';
|
|
17
|
+
/**
|
|
18
|
+
* Token-related error class
|
|
19
|
+
*/
|
|
20
|
+
export declare class TokenError extends AppError {
|
|
21
|
+
token?: string;
|
|
22
|
+
constructor(message: string, options?: any);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Decodes a JWT token without verifying its signature
|
|
26
|
+
* @param token JWT token string or previously decoded token
|
|
27
|
+
* @returns Decoded token payload
|
|
28
|
+
*/
|
|
29
|
+
export declare function decodeToken(token: string | DecodedToken): DecodedToken;
|
|
30
|
+
/**
|
|
31
|
+
* Extracts user claims from a token
|
|
32
|
+
* @param token JWT token string or previously decoded token
|
|
33
|
+
* @returns User claims object
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractClaims(token: string | DecodedToken): FirebaseUserClaims;
|
|
36
|
+
/**
|
|
37
|
+
* Gets user roles from claims
|
|
38
|
+
* @param claims User claims or token
|
|
39
|
+
* @returns Array of user roles
|
|
40
|
+
*/
|
|
41
|
+
export declare function getUserRoles(claims: FirebaseUserClaims | string | DecodedToken): TokenRole[];
|
|
42
|
+
/**
|
|
43
|
+
* Checks if claims or token includes a specific role
|
|
44
|
+
* @param claims User claims or token
|
|
45
|
+
* @param role Role to check for
|
|
46
|
+
* @returns True if user has the specified role
|
|
47
|
+
*/
|
|
48
|
+
export declare function hasRole(claims: FirebaseUserClaims | string | DecodedToken | null, role: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Checks if claims or token includes any of the specified roles
|
|
51
|
+
* @param claims User claims or token
|
|
52
|
+
* @param roles Roles to check for
|
|
53
|
+
* @returns True if user has any of the specified roles
|
|
54
|
+
*/
|
|
55
|
+
export declare function hasAnyRole(claims: FirebaseUserClaims | string | DecodedToken | null, roles: string[]): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Checks if a token is expired
|
|
58
|
+
* @param token Token string or decoded token
|
|
59
|
+
* @param options Options for expiration check
|
|
60
|
+
* @returns True if token is expired or invalid
|
|
61
|
+
*/
|
|
62
|
+
export declare function isTokenExpired(token: string | DecodedToken | null, options?: {
|
|
63
|
+
bufferSeconds?: number;
|
|
64
|
+
}): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Validates a token
|
|
67
|
+
* @param token Token string
|
|
68
|
+
* @returns True if token is valid and not expired
|
|
69
|
+
*/
|
|
70
|
+
export declare function isTokenValid(token: string | null): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Stores a token securely
|
|
73
|
+
* @param token Token to store
|
|
74
|
+
* @param options Storage options
|
|
75
|
+
* @returns True if successful
|
|
76
|
+
*/
|
|
77
|
+
export declare function storeToken(token: string, options?: TokenOptions): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Retrieves a token from storage
|
|
80
|
+
* @param options Retrieval options
|
|
81
|
+
* @returns The token or null if not found
|
|
82
|
+
*/
|
|
83
|
+
export declare function retrieveToken(options?: Omit<TokenOptions, 'ttl'>): string | null;
|
|
84
|
+
/**
|
|
85
|
+
* Clears all tokens from storage
|
|
86
|
+
* @returns True if successful
|
|
87
|
+
*/
|
|
88
|
+
export declare function clearTokens(): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Gets a fresh ID token from Firebase Auth
|
|
91
|
+
* @param options Options for token refresh
|
|
92
|
+
* @returns Promise resolving to ID token
|
|
93
|
+
*/
|
|
94
|
+
export declare function getIdToken(options?: {
|
|
95
|
+
forceRefresh?: boolean;
|
|
96
|
+
}): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Checks if two tokens are different
|
|
99
|
+
* @param oldToken First token
|
|
100
|
+
* @param newToken Second token
|
|
101
|
+
* @returns True if tokens are different
|
|
102
|
+
*/
|
|
103
|
+
export declare function haveTokensChanged(oldToken: string | null, newToken: string | null): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Safe version of decodeToken that does not throw
|
|
106
|
+
* @param token JWT token string
|
|
107
|
+
* @returns Result object with success status and data/error
|
|
108
|
+
*/
|
|
109
|
+
export declare function safeDecodeToken(token: string): Promise<{
|
|
110
|
+
success: boolean;
|
|
111
|
+
data?: DecodedToken;
|
|
112
|
+
error?: Error;
|
|
113
|
+
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Safe version of extractClaims that does not throw
|
|
116
|
+
* @param token JWT token string or decoded token
|
|
117
|
+
* @returns Result object with success status and data/error
|
|
118
|
+
*/
|
|
119
|
+
export declare function safeExtractClaims(token: string | DecodedToken): Promise<{
|
|
120
|
+
success: boolean;
|
|
121
|
+
data?: FirebaseUserClaims;
|
|
122
|
+
error?: Error;
|
|
123
|
+
}>;
|
|
124
|
+
/**
|
|
125
|
+
* Safe version of getIdToken that does not throw
|
|
126
|
+
* @param options Options for token refresh
|
|
127
|
+
* @returns Result object with success status and data/error
|
|
128
|
+
*/
|
|
129
|
+
export declare function safeGetIdToken(options?: {
|
|
130
|
+
forceRefresh?: boolean;
|
|
131
|
+
}): Promise<{
|
|
132
|
+
success: boolean;
|
|
133
|
+
data?: string;
|
|
134
|
+
error?: Error;
|
|
135
|
+
}>;
|
|
136
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAiB,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAA+C,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKvJ;;GAEG;AACH,qBAAa,UAAW,SAAQ,QAAQ;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ;CAW/C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,YAAY,CA6BtE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,kBAAkB,CAqF9E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,EAAE,CA+C5F;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAgCxG;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAM9G;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,EACnC,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,OAAO,CA2BT;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAqB1D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAoB7E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,KAAK,CAAM,GAAG,MAAM,GAAG,IAAI,CAkBpF;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAWrC;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAmB1F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CA8B3F;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC,CAaD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7E,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC,CAaD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC;IACtF,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAAC,CAaD"}
|
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/lib/utils/tokens.ts
|
|
3
|
+
* Token Utilities
|
|
4
|
+
*
|
|
5
|
+
* Utilities for working with JWT tokens, including:
|
|
6
|
+
* - Decoding and parsing tokens
|
|
7
|
+
* - Extracting claims and roles
|
|
8
|
+
* - Token validation and expiration checking
|
|
9
|
+
* - Token storage and retrieval
|
|
10
|
+
*
|
|
11
|
+
* NOTE: The key improvements here are in the extractClaims function,
|
|
12
|
+
* which now properly handles Firebase's JWT format and ensures
|
|
13
|
+
* boolean values are correctly interpreted.
|
|
14
|
+
*/
|
|
15
|
+
import { loggerService, AppError } from '@xbg.solutions/bpsk-core';
|
|
16
|
+
import { secureStorage } from '@xbg.solutions/bpsk-utils-secure-storage';
|
|
17
|
+
import { AUTH_NAMESPACE, AUTH_TOKEN_TTL } from '@xbg.solutions/bpsk-utils-secure-storage';
|
|
18
|
+
import { getAuth } from 'firebase/auth';
|
|
19
|
+
// Create a context-aware logger
|
|
20
|
+
const logger = loggerService.withContext('TokenUtils');
|
|
21
|
+
/**
|
|
22
|
+
* Token-related error class
|
|
23
|
+
*/
|
|
24
|
+
export class TokenError extends AppError {
|
|
25
|
+
constructor(message, options = {}) {
|
|
26
|
+
super(message, {
|
|
27
|
+
category: 'token',
|
|
28
|
+
...options
|
|
29
|
+
});
|
|
30
|
+
if (options.token) {
|
|
31
|
+
// Store only the first few characters of the token for debugging
|
|
32
|
+
this.token = options.token.substring(0, 10) + '...';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decodes a JWT token without verifying its signature
|
|
38
|
+
* @param token JWT token string or previously decoded token
|
|
39
|
+
* @returns Decoded token payload
|
|
40
|
+
*/
|
|
41
|
+
export function decodeToken(token) {
|
|
42
|
+
// If already decoded, return as is
|
|
43
|
+
if (typeof token !== 'string') {
|
|
44
|
+
return token;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
// Split the JWT into parts
|
|
48
|
+
const parts = token.split('.');
|
|
49
|
+
if (parts.length !== 3) {
|
|
50
|
+
throw new TokenError('Invalid token format', { token });
|
|
51
|
+
}
|
|
52
|
+
// Decode the payload (second part)
|
|
53
|
+
const payload = parts[1];
|
|
54
|
+
const decoded = JSON.parse(atob(payload.replace(/-/g, '+').replace(/_/g, '/')));
|
|
55
|
+
return decoded;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (error instanceof TokenError) {
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
throw new TokenError(`Failed to decode token: ${error instanceof Error ? error.message : String(error)}`, { token, originalError: error });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Extracts user claims from a token
|
|
66
|
+
* @param token JWT token string or previously decoded token
|
|
67
|
+
* @returns User claims object
|
|
68
|
+
*/
|
|
69
|
+
export function extractClaims(token) {
|
|
70
|
+
try {
|
|
71
|
+
// Decode the token if it's a string
|
|
72
|
+
const decoded = typeof token === 'string' ? decodeToken(token) : token;
|
|
73
|
+
// Firebase puts custom claims in different places depending on the token type
|
|
74
|
+
// This is the key fix: handle all possible claim locations and formats
|
|
75
|
+
let claims = {};
|
|
76
|
+
// Get the user ID from various possible locations
|
|
77
|
+
const uid = decoded.sub || decoded.user_id || decoded.uid;
|
|
78
|
+
if (uid) {
|
|
79
|
+
claims.uid = uid;
|
|
80
|
+
}
|
|
81
|
+
// Get email from claims
|
|
82
|
+
if (decoded.email) {
|
|
83
|
+
claims.email = decoded.email;
|
|
84
|
+
}
|
|
85
|
+
// Get email verified status if available
|
|
86
|
+
if (decoded.email_verified !== undefined) {
|
|
87
|
+
claims.emailVerified = decoded.email_verified;
|
|
88
|
+
}
|
|
89
|
+
// Get name/display name if available
|
|
90
|
+
if (decoded.name) {
|
|
91
|
+
claims.name = decoded.name;
|
|
92
|
+
}
|
|
93
|
+
// Handle custom claims - they might be in different locations
|
|
94
|
+
// Option 1: Firebase Auth tokens typically put custom claims in a 'claims' property
|
|
95
|
+
if (decoded.claims) {
|
|
96
|
+
// Copy the custom claims to the top level
|
|
97
|
+
Object.entries(decoded.claims).forEach(([key, value]) => {
|
|
98
|
+
// Ensure boolean values are properly converted
|
|
99
|
+
if (value === 'true' || value === '1' || value === 1) {
|
|
100
|
+
claims[key] = true;
|
|
101
|
+
}
|
|
102
|
+
else if (value === 'false' || value === '0' || value === 0) {
|
|
103
|
+
claims[key] = false;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
claims[key] = value;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Option 2: Some Firebase tokens might have claims directly at top level
|
|
111
|
+
// Check for common boolean flags directly
|
|
112
|
+
['isClient', 'isConsultant', 'isAdmin', 'isSysAdmin'].forEach(flag => {
|
|
113
|
+
if (decoded[flag] !== undefined && claims[flag] === undefined) {
|
|
114
|
+
// Ensure boolean values are properly converted
|
|
115
|
+
if (decoded[flag] === 'true' || decoded[flag] === '1' || decoded[flag] === 1) {
|
|
116
|
+
claims[flag] = true;
|
|
117
|
+
}
|
|
118
|
+
else if (decoded[flag] === 'false' || decoded[flag] === '0' || decoded[flag] === 0) {
|
|
119
|
+
claims[flag] = false;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
claims[flag] = !!decoded[flag];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
// Option 3: Some systems might put roles directly in the token
|
|
127
|
+
if (decoded.roles && !claims.roles) {
|
|
128
|
+
claims.roles = decoded.roles;
|
|
129
|
+
}
|
|
130
|
+
// Log detailed debug info to help troubleshoot claim extraction issues
|
|
131
|
+
logger.info('Extracted claims from token', {
|
|
132
|
+
uid: claims.uid,
|
|
133
|
+
hasRoles: !!claims.roles,
|
|
134
|
+
booleanFlags: {
|
|
135
|
+
isClient: claims.isClient,
|
|
136
|
+
isConsultant: claims.isConsultant,
|
|
137
|
+
isAdmin: claims.isAdmin,
|
|
138
|
+
isSysAdmin: claims.isSysAdmin
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return claims;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new TokenError(`Failed to extract claims: ${error instanceof Error ? error.message : String(error)}`, { originalError: error });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Gets user roles from claims
|
|
149
|
+
* @param claims User claims or token
|
|
150
|
+
* @returns Array of user roles
|
|
151
|
+
*/
|
|
152
|
+
export function getUserRoles(claims) {
|
|
153
|
+
try {
|
|
154
|
+
// Extract claims if token was provided
|
|
155
|
+
let userClaims;
|
|
156
|
+
if (typeof claims === 'string') {
|
|
157
|
+
userClaims = extractClaims(claims);
|
|
158
|
+
}
|
|
159
|
+
else if ('exp' in claims && typeof claims.exp === 'number') {
|
|
160
|
+
userClaims = extractClaims(claims);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
userClaims = claims;
|
|
164
|
+
}
|
|
165
|
+
if (!userClaims) {
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
// Check if roles exist as an array or string
|
|
169
|
+
if (userClaims.roles) {
|
|
170
|
+
// Convert to array if it's a string
|
|
171
|
+
if (typeof userClaims.roles === 'string') {
|
|
172
|
+
// Handle comma-separated or space-separated strings
|
|
173
|
+
return userClaims.roles.split(/[,\s]+/).filter(Boolean);
|
|
174
|
+
}
|
|
175
|
+
// Already an array
|
|
176
|
+
if (Array.isArray(userClaims.roles)) {
|
|
177
|
+
return userClaims.roles;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// If no roles found, derive from boolean flags
|
|
181
|
+
const roles = [];
|
|
182
|
+
// Map boolean flags to roles
|
|
183
|
+
if (userClaims.isClient === true)
|
|
184
|
+
roles.push('client');
|
|
185
|
+
if (userClaims.isConsultant === true)
|
|
186
|
+
roles.push('consultant');
|
|
187
|
+
if (userClaims.isAdmin === true)
|
|
188
|
+
roles.push('admin');
|
|
189
|
+
if (userClaims.isSysAdmin === true)
|
|
190
|
+
roles.push('sysadmin');
|
|
191
|
+
return roles;
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
logger.warn('Failed to get user roles', {
|
|
195
|
+
message: error instanceof Error ? error.message : String(error)
|
|
196
|
+
});
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Checks if claims or token includes a specific role
|
|
202
|
+
* @param claims User claims or token
|
|
203
|
+
* @param role Role to check for
|
|
204
|
+
* @returns True if user has the specified role
|
|
205
|
+
*/
|
|
206
|
+
export function hasRole(claims, role) {
|
|
207
|
+
if (!claims) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
// Extract claims if token was provided
|
|
212
|
+
let userClaims;
|
|
213
|
+
if (typeof claims === 'string') {
|
|
214
|
+
userClaims = extractClaims(claims);
|
|
215
|
+
}
|
|
216
|
+
else if ('exp' in claims && typeof claims.exp === 'number') {
|
|
217
|
+
userClaims = extractClaims(claims);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
userClaims = claims;
|
|
221
|
+
}
|
|
222
|
+
// Check direct boolean flag first (e.g., isAdmin for 'admin' role)
|
|
223
|
+
const booleanFlag = `is${role.charAt(0).toUpperCase() + role.slice(1)}`;
|
|
224
|
+
if (userClaims[booleanFlag] === true) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
// Then check roles array
|
|
228
|
+
const roles = getUserRoles(userClaims);
|
|
229
|
+
return roles.includes(role);
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
logger.warn(`Failed to check role "${role}"`, {
|
|
233
|
+
message: error instanceof Error ? error.message : String(error)
|
|
234
|
+
});
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Checks if claims or token includes any of the specified roles
|
|
240
|
+
* @param claims User claims or token
|
|
241
|
+
* @param roles Roles to check for
|
|
242
|
+
* @returns True if user has any of the specified roles
|
|
243
|
+
*/
|
|
244
|
+
export function hasAnyRole(claims, roles) {
|
|
245
|
+
if (!claims || !roles.length) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return roles.some(role => hasRole(claims, role));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Checks if a token is expired
|
|
252
|
+
* @param token Token string or decoded token
|
|
253
|
+
* @param options Options for expiration check
|
|
254
|
+
* @returns True if token is expired or invalid
|
|
255
|
+
*/
|
|
256
|
+
export function isTokenExpired(token, options = {}) {
|
|
257
|
+
if (!token) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
// Decode the token if it's a string
|
|
262
|
+
const decoded = typeof token === 'string' ? decodeToken(token) : token;
|
|
263
|
+
// Check if token has expiration
|
|
264
|
+
if (!decoded.exp) {
|
|
265
|
+
logger.warn('Token has no expiration claim');
|
|
266
|
+
return false; // Consider non-expiring tokens as valid
|
|
267
|
+
}
|
|
268
|
+
// Get current time with buffer
|
|
269
|
+
const bufferSeconds = options.bufferSeconds || 60; // Default 60 second buffer
|
|
270
|
+
const now = Math.floor(Date.now() / 1000) + bufferSeconds;
|
|
271
|
+
// Check if token is expired
|
|
272
|
+
return decoded.exp < now;
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
logger.warn('Error checking token expiration', {
|
|
276
|
+
message: error instanceof Error ? error.message : String(error)
|
|
277
|
+
});
|
|
278
|
+
return true; // Consider invalid tokens as expired
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Validates a token
|
|
283
|
+
* @param token Token string
|
|
284
|
+
* @returns True if token is valid and not expired
|
|
285
|
+
*/
|
|
286
|
+
export function isTokenValid(token) {
|
|
287
|
+
if (!token) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
// Try to decode the token
|
|
292
|
+
const decoded = decodeToken(token);
|
|
293
|
+
// Check if token is expired
|
|
294
|
+
if (isTokenExpired(decoded)) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
logger.warn('Error validating token', {
|
|
301
|
+
message: error instanceof Error ? error.message : String(error)
|
|
302
|
+
});
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Stores a token securely
|
|
308
|
+
* @param token Token to store
|
|
309
|
+
* @param options Storage options
|
|
310
|
+
* @returns True if successful
|
|
311
|
+
*/
|
|
312
|
+
export function storeToken(token, options = {}) {
|
|
313
|
+
try {
|
|
314
|
+
const { tokenType = 'id', mechanism = 'cookie', ttl = AUTH_TOKEN_TTL } = options;
|
|
315
|
+
const key = `${tokenType}Token`;
|
|
316
|
+
return secureStorage.setItem(key, token, {
|
|
317
|
+
namespace: AUTH_NAMESPACE,
|
|
318
|
+
mechanism,
|
|
319
|
+
ttl
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
const logError = error instanceof Error ? error : new Error(String(error));
|
|
324
|
+
logger.error('Failed to store token', logError);
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Retrieves a token from storage
|
|
330
|
+
* @param options Retrieval options
|
|
331
|
+
* @returns The token or null if not found
|
|
332
|
+
*/
|
|
333
|
+
export function retrieveToken(options = {}) {
|
|
334
|
+
try {
|
|
335
|
+
const { tokenType = 'id', mechanism = 'cookie' } = options;
|
|
336
|
+
const key = `${tokenType}Token`;
|
|
337
|
+
return secureStorage.getItem(key, {
|
|
338
|
+
namespace: AUTH_NAMESPACE,
|
|
339
|
+
mechanism
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
const logError = error instanceof Error ? error : new Error(String(error));
|
|
344
|
+
logger.error('Failed to retrieve token', logError);
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Clears all tokens from storage
|
|
350
|
+
* @returns True if successful
|
|
351
|
+
*/
|
|
352
|
+
export function clearTokens() {
|
|
353
|
+
try {
|
|
354
|
+
return secureStorage.clear({
|
|
355
|
+
namespace: AUTH_NAMESPACE,
|
|
356
|
+
allMechanisms: true
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
const logError = error instanceof Error ? error : new Error(String(error));
|
|
361
|
+
logger.error('Failed to clear tokens', logError);
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Gets a fresh ID token from Firebase Auth
|
|
367
|
+
* @param options Options for token refresh
|
|
368
|
+
* @returns Promise resolving to ID token
|
|
369
|
+
*/
|
|
370
|
+
export async function getIdToken(options = {}) {
|
|
371
|
+
try {
|
|
372
|
+
const auth = getAuth();
|
|
373
|
+
const user = auth.currentUser;
|
|
374
|
+
if (!user) {
|
|
375
|
+
throw new TokenError('No authenticated user');
|
|
376
|
+
}
|
|
377
|
+
const { forceRefresh = false } = options;
|
|
378
|
+
// Get a fresh token
|
|
379
|
+
return await user.getIdToken(forceRefresh);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
throw new TokenError(`Failed to get ID token: ${error instanceof Error ? error.message : String(error)}`, { originalError: error });
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Checks if two tokens are different
|
|
387
|
+
* @param oldToken First token
|
|
388
|
+
* @param newToken Second token
|
|
389
|
+
* @returns True if tokens are different
|
|
390
|
+
*/
|
|
391
|
+
export function haveTokensChanged(oldToken, newToken) {
|
|
392
|
+
// Both null or same string
|
|
393
|
+
if (oldToken === newToken) {
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
// One is null, the other isn't
|
|
397
|
+
if (!oldToken || !newToken) {
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
// Both are strings, compare content
|
|
401
|
+
try {
|
|
402
|
+
// Get just the payload part for comparison
|
|
403
|
+
const oldPayload = oldToken.split('.')[1];
|
|
404
|
+
const newPayload = newToken.split('.')[1];
|
|
405
|
+
// Different payloads
|
|
406
|
+
if (oldPayload !== newPayload) {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
// If any error in comparison, assume they're different
|
|
413
|
+
logger.warn('Error comparing tokens', {
|
|
414
|
+
message: error instanceof Error ? error.message : String(error)
|
|
415
|
+
});
|
|
416
|
+
return true;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Safe version of decodeToken that does not throw
|
|
421
|
+
* @param token JWT token string
|
|
422
|
+
* @returns Result object with success status and data/error
|
|
423
|
+
*/
|
|
424
|
+
export async function safeDecodeToken(token) {
|
|
425
|
+
try {
|
|
426
|
+
const data = decodeToken(token);
|
|
427
|
+
return {
|
|
428
|
+
success: true,
|
|
429
|
+
data
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
return {
|
|
434
|
+
success: false,
|
|
435
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Safe version of extractClaims that does not throw
|
|
441
|
+
* @param token JWT token string or decoded token
|
|
442
|
+
* @returns Result object with success status and data/error
|
|
443
|
+
*/
|
|
444
|
+
export async function safeExtractClaims(token) {
|
|
445
|
+
try {
|
|
446
|
+
const data = extractClaims(token);
|
|
447
|
+
return {
|
|
448
|
+
success: true,
|
|
449
|
+
data
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
return {
|
|
454
|
+
success: false,
|
|
455
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Safe version of getIdToken that does not throw
|
|
461
|
+
* @param options Options for token refresh
|
|
462
|
+
* @returns Result object with success status and data/error
|
|
463
|
+
*/
|
|
464
|
+
export async function safeGetIdToken(options = {}) {
|
|
465
|
+
try {
|
|
466
|
+
const data = await getIdToken(options);
|
|
467
|
+
return {
|
|
468
|
+
success: true,
|
|
469
|
+
data
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
catch (error) {
|
|
473
|
+
return {
|
|
474
|
+
success: false,
|
|
475
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xbg.solutions/bpsk-utils-firebase-auth",
|
|
3
|
+
"version": "1.2.3",
|
|
4
|
+
"description": "XBG Firebase Auth - Auth service, token service, auth stores, auth guard",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"lib"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"build:watch": "tsc --watch",
|
|
14
|
+
"clean": "rm -rf lib",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@xbg.solutions/bpsk-core": "^1.0.0",
|
|
22
|
+
"@xbg.solutions/bpsk-utils-csrf": "^1.0.0",
|
|
23
|
+
"@xbg.solutions/bpsk-utils-secure-storage": "^1.0.0",
|
|
24
|
+
"@xbg.solutions/bpsk-utils-rbac": "^1.0.0"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"firebase": "^11.0.0",
|
|
28
|
+
"svelte": "^5.0.0",
|
|
29
|
+
"@sveltejs/kit": "^2.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|