@tern-secure/auth 1.1.0-canary.v20251008165428 → 1.1.0-canary.v20251019190011
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/dist/cjs/{resources → auth}/AuthCookieManager.js +12 -1
- package/dist/cjs/auth/AuthCookieManager.js.map +1 -0
- package/dist/cjs/auth/cookies/session.js +83 -0
- package/dist/cjs/auth/cookies/session.js.map +1 -0
- package/dist/cjs/auth/request.js +159 -0
- package/dist/cjs/auth/request.js.map +1 -0
- package/dist/cjs/instance/TernAuth.js +109 -19
- package/dist/cjs/instance/TernAuth.js.map +1 -1
- package/dist/cjs/instance/events.js +3 -2
- package/dist/cjs/instance/events.js.map +1 -1
- package/dist/cjs/instance/jwtClient.js +72 -0
- package/dist/cjs/instance/jwtClient.js.map +1 -0
- package/dist/cjs/resources/Base.js +7 -0
- package/dist/cjs/resources/Base.js.map +1 -1
- package/dist/cjs/resources/Session.js +105 -0
- package/dist/cjs/resources/Session.js.map +1 -0
- package/dist/cjs/resources/SignIn.js +25 -27
- package/dist/cjs/resources/SignIn.js.map +1 -1
- package/dist/cjs/resources/Token.js +32 -0
- package/dist/cjs/resources/Token.js.map +1 -0
- package/dist/cjs/resources/UserData.js +43 -0
- package/dist/cjs/resources/UserData.js.map +1 -0
- package/dist/cjs/resources/cookie.js +154 -0
- package/dist/cjs/resources/cookie.js.map +1 -0
- package/dist/cjs/resources/internal.js +4 -2
- package/dist/cjs/resources/internal.js.map +1 -1
- package/dist/cjs/utils/jwt.js +46 -0
- package/dist/cjs/utils/jwt.js.map +1 -0
- package/dist/cjs/utils/mapDecode.js +33 -0
- package/dist/cjs/utils/mapDecode.js.map +1 -0
- package/dist/esm/{resources → auth}/AuthCookieManager.js +13 -4
- package/dist/esm/auth/AuthCookieManager.js.map +1 -0
- package/dist/esm/auth/cookies/session.js +58 -0
- package/dist/esm/auth/cookies/session.js.map +1 -0
- package/dist/esm/auth/request.js +134 -0
- package/dist/esm/auth/request.js.map +1 -0
- package/dist/esm/instance/TernAuth.js +111 -20
- package/dist/esm/instance/TernAuth.js.map +1 -1
- package/dist/esm/instance/events.js +3 -2
- package/dist/esm/instance/events.js.map +1 -1
- package/dist/esm/instance/jwtClient.js +47 -0
- package/dist/esm/instance/jwtClient.js.map +1 -0
- package/dist/esm/resources/Base.js +7 -0
- package/dist/esm/resources/Base.js.map +1 -1
- package/dist/esm/resources/Session.js +81 -0
- package/dist/esm/resources/Session.js.map +1 -0
- package/dist/esm/resources/SignIn.js +25 -27
- package/dist/esm/resources/SignIn.js.map +1 -1
- package/dist/esm/resources/Token.js +8 -0
- package/dist/esm/resources/Token.js.map +1 -0
- package/dist/esm/resources/UserData.js +19 -0
- package/dist/esm/resources/UserData.js.map +1 -0
- package/dist/esm/resources/cookie.js +130 -0
- package/dist/esm/resources/cookie.js.map +1 -0
- package/dist/esm/resources/internal.js +2 -1
- package/dist/esm/resources/internal.js.map +1 -1
- package/dist/esm/utils/jwt.js +22 -0
- package/dist/esm/utils/jwt.js.map +1 -0
- package/dist/esm/utils/mapDecode.js +9 -0
- package/dist/esm/utils/mapDecode.js.map +1 -0
- package/dist/types/{resources → auth}/AuthCookieManager.d.ts +5 -1
- package/dist/types/auth/AuthCookieManager.d.ts.map +1 -0
- package/dist/types/auth/cookies/session.d.ts +8 -0
- package/dist/types/auth/cookies/session.d.ts.map +1 -0
- package/dist/types/auth/request.d.ts +49 -0
- package/dist/types/auth/request.d.ts.map +1 -0
- package/dist/types/instance/TernAuth.d.ts +17 -1
- package/dist/types/instance/TernAuth.d.ts.map +1 -1
- package/dist/types/instance/events.d.ts +9 -1
- package/dist/types/instance/events.d.ts.map +1 -1
- package/dist/types/instance/jwtClient.d.ts +22 -0
- package/dist/types/instance/jwtClient.d.ts.map +1 -0
- package/dist/types/resources/Base.d.ts +6 -0
- package/dist/types/resources/Base.d.ts.map +1 -1
- package/dist/types/resources/Session.d.ts +49 -0
- package/dist/types/resources/Session.d.ts.map +1 -0
- package/dist/types/resources/SignIn.d.ts +3 -1
- package/dist/types/resources/SignIn.d.ts.map +1 -1
- package/dist/types/resources/Token.d.ts +5 -0
- package/dist/types/resources/Token.d.ts.map +1 -0
- package/dist/types/resources/UserData.d.ts +8 -0
- package/dist/types/resources/UserData.d.ts.map +1 -0
- package/dist/types/resources/cookie.d.ts +24 -0
- package/dist/types/resources/cookie.d.ts.map +1 -0
- package/dist/types/resources/internal.d.ts +2 -1
- package/dist/types/resources/internal.d.ts.map +1 -1
- package/dist/types/utils/jwt.d.ts +12 -0
- package/dist/types/utils/jwt.d.ts.map +1 -0
- package/dist/types/utils/mapDecode.d.ts +4 -0
- package/dist/types/utils/mapDecode.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/cjs/resources/AuthCookieManager.js.map +0 -1
- package/dist/esm/resources/AuthCookieManager.js.map +0 -1
- package/dist/types/resources/AuthCookieManager.d.ts.map +0 -1
|
@@ -22,6 +22,7 @@ __export(AuthCookieManager_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(AuthCookieManager_exports);
|
|
24
24
|
var import_cookie = require("@tern-secure/shared/cookie");
|
|
25
|
+
var import_session = require("./cookies/session");
|
|
25
26
|
const CSRF_COOKIE_NAME = "_session_terncf";
|
|
26
27
|
const CSRF_COOKIE_OPTIONS = {
|
|
27
28
|
secure: true,
|
|
@@ -31,8 +32,12 @@ const CSRF_COOKIE_OPTIONS = {
|
|
|
31
32
|
};
|
|
32
33
|
class AuthCookieManager {
|
|
33
34
|
csrfCookieHandler = (0, import_cookie.cookieHandler)(CSRF_COOKIE_NAME);
|
|
35
|
+
sessionCookie;
|
|
36
|
+
idTokenCookie;
|
|
34
37
|
constructor() {
|
|
35
38
|
this.ensureCSRFToken();
|
|
39
|
+
this.sessionCookie = (0, import_session.createSessionCookie)();
|
|
40
|
+
this.idTokenCookie = (0, import_session.createIdTokenCookie)();
|
|
36
41
|
}
|
|
37
42
|
generateCSRFToken() {
|
|
38
43
|
const array = new Uint8Array(32);
|
|
@@ -49,7 +54,7 @@ class AuthCookieManager {
|
|
|
49
54
|
}
|
|
50
55
|
/**
|
|
51
56
|
* Set CSRFcookie
|
|
52
|
-
|
|
57
|
+
*/
|
|
53
58
|
setCSRFToken(token) {
|
|
54
59
|
try {
|
|
55
60
|
if (token.token) {
|
|
@@ -71,6 +76,12 @@ class AuthCookieManager {
|
|
|
71
76
|
return void 0;
|
|
72
77
|
}
|
|
73
78
|
}
|
|
79
|
+
getSessionCookie() {
|
|
80
|
+
return this.sessionCookie.get();
|
|
81
|
+
}
|
|
82
|
+
getIdTokenCookie() {
|
|
83
|
+
return this.idTokenCookie.get();
|
|
84
|
+
}
|
|
74
85
|
/**
|
|
75
86
|
* Clear all authentication cookies
|
|
76
87
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/AuthCookieManager.ts"],"sourcesContent":["import type { CookieAttributes } from '@tern-secure/shared/cookie';\nimport { cookieHandler } from '@tern-secure/shared/cookie';\n\nimport type { SessionCookieHandler } from './cookies/session';\nimport { createIdTokenCookie, createSessionCookie } from './cookies/session';\n\nconst CSRF_COOKIE_NAME = '_session_terncf';\n\ntype CSRFToken = {\n token: string | null;\n};\n\ntype CookieOptions = CookieAttributes;\n\nconst CSRF_COOKIE_OPTIONS: CookieOptions = {\n secure: true,\n sameSite: 'strict',\n expires: 1 / 24, //1 hour\n};\n\n/**\n * AuthCookieManger class for managing authentication state and cookies\n */\nexport class AuthCookieManager {\n private readonly csrfCookieHandler = cookieHandler(CSRF_COOKIE_NAME);\n private sessionCookie: SessionCookieHandler;\n private idTokenCookie: SessionCookieHandler;\n\n constructor() {\n this.ensureCSRFToken();\n this.sessionCookie = createSessionCookie();\n this.idTokenCookie = createIdTokenCookie();\n }\n\n private generateCSRFToken(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\n }\n\n private ensureCSRFToken(): string {\n let ctoken = this.getCSRFToken();\n if (!ctoken) {\n ctoken = this.generateCSRFToken();\n this.setCSRFToken({ token: ctoken });\n }\n return ctoken;\n }\n\n /**\n * Set CSRFcookie\n */\n\n setCSRFToken(token: CSRFToken): void {\n try {\n if (token.token) {\n this.csrfCookieHandler.set(token.token, CSRF_COOKIE_OPTIONS);\n }\n } catch (error) {\n console.error('Failed to set CSRF token:', error);\n throw new Error('Unable to store CSRF token');\n }\n }\n\n /**\n * Get CSRF token from cookies\n */\n getCSRFToken(): string | undefined {\n try {\n return this.csrfCookieHandler.get();\n } catch (error) {\n console.error('Failed to get CSRF token:', error);\n return undefined;\n }\n }\n\n public getSessionCookie() {\n return this.sessionCookie.get();\n }\n\n public getIdTokenCookie() {\n return this.idTokenCookie.get();\n }\n\n /**\n * Clear all authentication cookies\n */\n clearAuth(): void {\n try {\n this.csrfCookieHandler.remove();\n } catch (error) {\n console.error('Failed to clear auth cookies:', error);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAA8B;AAG9B,qBAAyD;AAEzD,MAAM,mBAAmB;AAQzB,MAAM,sBAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS,IAAI;AAAA;AACf;AAKO,MAAM,kBAAkB;AAAA,EACZ,wBAAoB,6BAAc,gBAAgB;AAAA,EAC3D;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,gBAAgB;AACrB,SAAK,oBAAgB,oCAAoB;AACzC,SAAK,oBAAgB,oCAAoB;AAAA,EAC3C;AAAA,EAEQ,oBAA4B;AAClC,UAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,WAAO,gBAAgB,KAAK;AAC5B,WAAO,MAAM,KAAK,OAAO,UAAQ,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,EAC9E;AAAA,EAEQ,kBAA0B;AAChC,QAAI,SAAS,KAAK,aAAa;AAC/B,QAAI,CAAC,QAAQ;AACX,eAAS,KAAK,kBAAkB;AAChC,WAAK,aAAa,EAAE,OAAO,OAAO,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,OAAwB;AACnC,QAAI;AACF,UAAI,MAAM,OAAO;AACf,aAAK,kBAAkB,IAAI,MAAM,OAAO,mBAAmB;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAmC;AACjC,QAAI;AACF,aAAO,KAAK,kBAAkB,IAAI;AAAA,IACpC,SAAS,OAAO;AACd,cAAQ,MAAM,6BAA6B,KAAK;AAChD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEO,mBAAmB;AACxB,WAAO,KAAK,cAAc,IAAI;AAAA,EAChC;AAAA,EAEO,mBAAmB;AACxB,WAAO,KAAK,cAAc,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAkB;AAChB,QAAI;AACF,WAAK,kBAAkB,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var session_exports = {};
|
|
20
|
+
__export(session_exports, {
|
|
21
|
+
createIdTokenCookie: () => createIdTokenCookie,
|
|
22
|
+
createSessionCookie: () => createSessionCookie
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(session_exports);
|
|
25
|
+
var import_cookie = require("@tern-secure/shared/cookie");
|
|
26
|
+
const SESSION_COOKIE_NAME = "__session";
|
|
27
|
+
const ID_TOKEN_COOKIE_NAME = "FIREBASE_[DEFAULT]";
|
|
28
|
+
const REFRESH_TOKEN_COOKIE_NAME = "FIREBASEID_[DEFAULT]";
|
|
29
|
+
const CUSTOM_COOKIE_NAME = "__custom";
|
|
30
|
+
const createSessionCookie = () => {
|
|
31
|
+
const sessionCookie = (0, import_cookie.cookieHandler)(SESSION_COOKIE_NAME);
|
|
32
|
+
const set = (token) => {
|
|
33
|
+
sessionCookie.set(token, {
|
|
34
|
+
httpOnly: false,
|
|
35
|
+
secure: true,
|
|
36
|
+
sameSite: "strict",
|
|
37
|
+
path: "/"
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const remove = () => {
|
|
41
|
+
sessionCookie.remove({
|
|
42
|
+
path: "/"
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const get = () => {
|
|
46
|
+
return sessionCookie.get();
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
set,
|
|
50
|
+
remove,
|
|
51
|
+
get
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const createIdTokenCookie = () => {
|
|
55
|
+
const prefix = (0, import_cookie.getCookiePrefix)();
|
|
56
|
+
const cookieName = (0, import_cookie.getCookieName)(ID_TOKEN_COOKIE_NAME, prefix);
|
|
57
|
+
const sessionCookie = (0, import_cookie.cookieHandler)(cookieName);
|
|
58
|
+
const set = (token) => {
|
|
59
|
+
sessionCookie.set(token, {
|
|
60
|
+
httpOnly: false,
|
|
61
|
+
secure: true,
|
|
62
|
+
sameSite: "strict",
|
|
63
|
+
path: "/"
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const remove = () => {
|
|
67
|
+
sessionCookie.remove({
|
|
68
|
+
path: "/"
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
const get = () => sessionCookie.get();
|
|
72
|
+
return {
|
|
73
|
+
set,
|
|
74
|
+
remove,
|
|
75
|
+
get
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
createIdTokenCookie,
|
|
81
|
+
createSessionCookie
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/auth/cookies/session.ts"],"sourcesContent":["import { cookieHandler, getCookieName, getCookiePrefix } from '@tern-secure/shared/cookie';\n\nconst SESSION_COOKIE_NAME = '__session';\nconst ID_TOKEN_COOKIE_NAME = 'FIREBASE_[DEFAULT]';\nconst REFRESH_TOKEN_COOKIE_NAME = 'FIREBASEID_[DEFAULT]';\nconst CUSTOM_COOKIE_NAME = '__custom';\n\nexport type SessionCookieHandler = {\n set: (token: string) => void;\n remove: () => void;\n get: () => string | undefined;\n};\n\nexport const createSessionCookie = (): SessionCookieHandler => {\n const sessionCookie = cookieHandler(SESSION_COOKIE_NAME);\n\n const set = (token: string) => {\n sessionCookie.set(token, {\n httpOnly: false,\n secure: true,\n sameSite: 'strict',\n path: '/',\n });\n };\n\n const remove = () => {\n sessionCookie.remove({\n path: '/',\n });\n };\n\n const get = () => {\n return sessionCookie.get();\n };\n\n return {\n set,\n remove,\n get,\n };\n};\n\nexport const createIdTokenCookie = (): SessionCookieHandler => {\n const prefix = getCookiePrefix();\n const cookieName = getCookieName(ID_TOKEN_COOKIE_NAME, prefix);\n const sessionCookie = cookieHandler(cookieName);\n\n const set = (token: string) => {\n sessionCookie.set(token, {\n httpOnly: false,\n secure: true,\n sameSite: 'strict',\n path: '/',\n });\n };\n\n const remove = () => {\n sessionCookie.remove({\n path: '/',\n });\n };\n\n const get = () => sessionCookie.get();\n\n return {\n set,\n remove,\n get,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA8D;AAE9D,MAAM,sBAAsB;AAC5B,MAAM,uBAAuB;AAC7B,MAAM,4BAA4B;AAClC,MAAM,qBAAqB;AAQpB,MAAM,sBAAsB,MAA4B;AAC7D,QAAM,oBAAgB,6BAAc,mBAAmB;AAEvD,QAAM,MAAM,CAAC,UAAkB;AAC7B,kBAAc,IAAI,OAAO;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,OAAO;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM;AAChB,WAAO,cAAc,IAAI;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,MAAM,sBAAsB,MAA4B;AAC7D,QAAM,aAAS,+BAAgB;AAC/B,QAAM,iBAAa,6BAAc,sBAAsB,MAAM;AAC7D,QAAM,oBAAgB,6BAAc,UAAU;AAE9C,QAAM,MAAM,CAAC,UAAkB;AAC7B,kBAAc,IAAI,OAAO;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,OAAO;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,MAAM,cAAc,IAAI;AAEpC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var request_exports = {};
|
|
20
|
+
__export(request_exports, {
|
|
21
|
+
ClientAuthRequest: () => ClientAuthRequest,
|
|
22
|
+
createClientAuthRequest: () => createClientAuthRequest
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(request_exports);
|
|
25
|
+
var import_cookie = require("../resources/cookie");
|
|
26
|
+
var import_UserData = require("../resources/UserData");
|
|
27
|
+
class ClientAuthRequest {
|
|
28
|
+
cookie;
|
|
29
|
+
userData;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.cookie = new import_cookie.Cookie();
|
|
32
|
+
this.userData = new import_UserData.UserData();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get UserData
|
|
36
|
+
*/
|
|
37
|
+
async getUserData() {
|
|
38
|
+
try {
|
|
39
|
+
const response = await this.userData.get();
|
|
40
|
+
if (response == null ? void 0 : response.response) {
|
|
41
|
+
return response.response;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error("[ClientAuthRequest] Failed to get user data:", error);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get ID token from httpOnly cookies
|
|
51
|
+
*/
|
|
52
|
+
async getIdTokenFromCookie() {
|
|
53
|
+
try {
|
|
54
|
+
return await this.cookie.getIdToken();
|
|
55
|
+
} catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
error: `Failed to retrieve ID token from cookies: ${error instanceof Error ? error.message : String(error)}`
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get session token from httpOnly cookies
|
|
64
|
+
*/
|
|
65
|
+
async getSessionTokenFromCookie() {
|
|
66
|
+
try {
|
|
67
|
+
return await this.cookie.getSessionToken();
|
|
68
|
+
} catch (error) {
|
|
69
|
+
return {
|
|
70
|
+
success: false,
|
|
71
|
+
error: `Failed to retrieve session token from cookies: ${error instanceof Error ? error.message : String(error)}`
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get refresh token from httpOnly cookies
|
|
77
|
+
*/
|
|
78
|
+
async getRefreshTokenFromCookie() {
|
|
79
|
+
try {
|
|
80
|
+
return await this.cookie.getRefreshToken();
|
|
81
|
+
} catch (error) {
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: `Failed to retrieve refresh token from cookies: ${error instanceof Error ? error.message : String(error)}`
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get custom token from httpOnly cookies
|
|
90
|
+
*/
|
|
91
|
+
async getCustomTokenFromCookie() {
|
|
92
|
+
try {
|
|
93
|
+
return await this.cookie.getCustomToken();
|
|
94
|
+
} catch (error) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
error: `Failed to retrieve custom token from cookies: ${error instanceof Error ? error.message : String(error)}`
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get all tokens from httpOnly cookies
|
|
103
|
+
*/
|
|
104
|
+
async getAllTokensFromCookies() {
|
|
105
|
+
try {
|
|
106
|
+
return await this.cookie.getAllTokens();
|
|
107
|
+
} catch (error) {
|
|
108
|
+
const errorMessage = `Failed to retrieve tokens from cookies: ${error instanceof Error ? error.message : String(error)}`;
|
|
109
|
+
return {
|
|
110
|
+
idToken: { success: false, error: errorMessage },
|
|
111
|
+
sessionToken: { success: false, error: errorMessage },
|
|
112
|
+
refreshToken: { success: false, error: errorMessage },
|
|
113
|
+
customToken: { success: false, error: errorMessage }
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if a specific token exists in cookies
|
|
119
|
+
*/
|
|
120
|
+
async hasTokenInCookie(tokenType) {
|
|
121
|
+
try {
|
|
122
|
+
return await this.cookie.hasToken(tokenType);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
console.error(`[ClientAuthRequest] Failed to check ${tokenType} existence:`, error);
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get user data using token from cookies
|
|
130
|
+
* First tries to get ID token from cookies, then uses it for user data request
|
|
131
|
+
*/
|
|
132
|
+
async getUserDataWithCookieToken() {
|
|
133
|
+
try {
|
|
134
|
+
const idTokenResult = await this.getIdTokenFromCookie();
|
|
135
|
+
if (!idTokenResult.success || !idTokenResult.token) {
|
|
136
|
+
console.warn("[ClientAuthRequest] No ID token available in cookies for user data request");
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const userData = new import_UserData.UserData();
|
|
140
|
+
const response = await userData.get();
|
|
141
|
+
if (response == null ? void 0 : response.response) {
|
|
142
|
+
return response.response;
|
|
143
|
+
}
|
|
144
|
+
return null;
|
|
145
|
+
} catch (error) {
|
|
146
|
+
console.error("[ClientAuthRequest] Failed to get user data with cookie token:", error);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function createClientAuthRequest() {
|
|
152
|
+
return new ClientAuthRequest();
|
|
153
|
+
}
|
|
154
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
155
|
+
0 && (module.exports = {
|
|
156
|
+
ClientAuthRequest,
|
|
157
|
+
createClientAuthRequest
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/request.ts"],"sourcesContent":["import type { TernSecureUserData } from '@tern-secure/types';\n\nimport type { TokenResult } from '../resources/cookie';\nimport { Cookie } from '../resources/cookie';\nimport { UserData } from '../resources/UserData';\n\nexport interface UserDataParams {\n idToken: string;\n}\n\n/**\n * Client-side authentication request functionality\n * Uses backend API calls through the configured apiUrl\n */\nexport class ClientAuthRequest {\n private cookie: Cookie;\n private userData: UserData;\n\n constructor() {\n this.cookie = new Cookie();\n this.userData = new UserData();\n }\n\n /**\n * Get UserData\n */\n async getUserData(): Promise<TernSecureUserData | null> {\n try {\n const response = await this.userData.get();\n\n if (response?.response) {\n return response.response as TernSecureUserData;\n }\n\n return null;\n } catch (error) {\n console.error('[ClientAuthRequest] Failed to get user data:', error);\n throw error;\n }\n }\n\n /**\n * Get ID token from httpOnly cookies\n */\n async getIdTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getIdToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve ID token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get session token from httpOnly cookies\n */\n async getSessionTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getSessionToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve session token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get refresh token from httpOnly cookies\n */\n async getRefreshTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getRefreshToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve refresh token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get custom token from httpOnly cookies\n */\n async getCustomTokenFromCookie(): Promise<TokenResult> {\n try {\n return await this.cookie.getCustomToken();\n } catch (error) {\n return {\n success: false,\n error: `Failed to retrieve custom token from cookies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Get all tokens from httpOnly cookies\n */\n async getAllTokensFromCookies(): Promise<Record<string, TokenResult>> {\n try {\n return await this.cookie.getAllTokens();\n } catch (error) {\n const errorMessage = `Failed to retrieve tokens from cookies: ${error instanceof Error ? error.message : String(error)}`;\n return {\n idToken: { success: false, error: errorMessage },\n sessionToken: { success: false, error: errorMessage },\n refreshToken: { success: false, error: errorMessage },\n customToken: { success: false, error: errorMessage },\n };\n }\n }\n\n /**\n * Check if a specific token exists in cookies\n */\n async hasTokenInCookie(\n tokenType: 'idToken' | 'sessionToken' | 'refreshToken' | 'customToken',\n ): Promise<boolean> {\n try {\n return await this.cookie.hasToken(tokenType);\n } catch (error) {\n console.error(`[ClientAuthRequest] Failed to check ${tokenType} existence:`, error);\n return false;\n }\n }\n\n /**\n * Get user data using token from cookies\n * First tries to get ID token from cookies, then uses it for user data request\n */\n async getUserDataWithCookieToken(): Promise<TernSecureUserData | null> {\n try {\n const idTokenResult = await this.getIdTokenFromCookie();\n\n if (!idTokenResult.success || !idTokenResult.token) {\n console.warn('[ClientAuthRequest] No ID token available in cookies for user data request');\n return null;\n }\n\n const userData = new UserData();\n const response = await userData.get();\n\n if (response?.response) {\n return response.response as TernSecureUserData;\n }\n\n return null;\n } catch (error) {\n console.error('[ClientAuthRequest] Failed to get user data with cookie token:', error);\n throw error;\n }\n }\n}\n\nexport function createClientAuthRequest(): ClientAuthRequest {\n return new ClientAuthRequest();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -29,18 +29,20 @@ var import_utils = require("@tern-secure/shared/utils");
|
|
|
29
29
|
var import_app = require("firebase/app");
|
|
30
30
|
var import_auth = require("firebase/auth");
|
|
31
31
|
var import_installations = require("firebase/installations");
|
|
32
|
+
var import_request = require("../auth/request");
|
|
32
33
|
var import_internal = require("../resources/internal");
|
|
33
34
|
var import_construct = require("../utils/construct");
|
|
34
35
|
var import_c_coreApiClient = require("./c_coreApiClient");
|
|
35
36
|
var import_events = require("./events");
|
|
37
|
+
var import_jwtClient = require("./jwtClient");
|
|
36
38
|
function inBrowser() {
|
|
37
39
|
return typeof window !== "undefined";
|
|
38
40
|
}
|
|
39
41
|
class TernSecureAuth {
|
|
40
|
-
static version = "1.1.0-canary.
|
|
42
|
+
static version = "1.1.0-canary.v20251019190011";
|
|
41
43
|
static sdkMetadata = {
|
|
42
44
|
name: "@tern-secure/auth",
|
|
43
|
-
version: "1.1.0-canary.
|
|
45
|
+
version: "1.1.0-canary.v20251019190011",
|
|
44
46
|
environment: process.env.NODE_ENV || "production"
|
|
45
47
|
};
|
|
46
48
|
static instance = null;
|
|
@@ -62,9 +64,11 @@ class TernSecureAuth {
|
|
|
62
64
|
#listeners = [];
|
|
63
65
|
#options = {};
|
|
64
66
|
#authCookieManager;
|
|
67
|
+
#clientAuthRequest;
|
|
65
68
|
#publicEventBus = (0, import_ternStatusEvent.createTernAuthEventBus)();
|
|
66
69
|
signIn;
|
|
67
70
|
signUp;
|
|
71
|
+
session;
|
|
68
72
|
get isReady() {
|
|
69
73
|
return this.status === "ready";
|
|
70
74
|
}
|
|
@@ -115,6 +119,15 @@ class TernSecureAuth {
|
|
|
115
119
|
import_internal.TernSecureBase.ternsecure = this;
|
|
116
120
|
}
|
|
117
121
|
getApiClient = () => this.#apiClient;
|
|
122
|
+
/**
|
|
123
|
+
* Get user data for the provided ID token via backend API
|
|
124
|
+
*/
|
|
125
|
+
async getUserData() {
|
|
126
|
+
if (!this.#clientAuthRequest) {
|
|
127
|
+
throw new Error("Client auth request not initialized");
|
|
128
|
+
}
|
|
129
|
+
return this.#clientAuthRequest.getUserData();
|
|
130
|
+
}
|
|
118
131
|
setLoading(isLoading) {
|
|
119
132
|
this.isLoading = isLoading;
|
|
120
133
|
}
|
|
@@ -157,11 +170,19 @@ class TernSecureAuth {
|
|
|
157
170
|
throw new Error("apiUrl is required to initialize TernSecureAuth");
|
|
158
171
|
}
|
|
159
172
|
this.initializeFirebaseApp(this.#options.ternSecureConfig);
|
|
160
|
-
|
|
173
|
+
const isBrowserCookiePersistence = this.#options.persistence === "browserCookie";
|
|
174
|
+
if (!isBrowserCookiePersistence) {
|
|
175
|
+
this.authStateUnsubscribe = this.initAuthStateListener();
|
|
176
|
+
}
|
|
161
177
|
this.#authCookieManager = new import_internal.AuthCookieManager();
|
|
162
178
|
this.csrfToken = this.#authCookieManager.getCSRFToken();
|
|
179
|
+
this.#clientAuthRequest = (0, import_request.createClientAuthRequest)();
|
|
163
180
|
this.signIn = new import_internal.SignIn(this.auth, this.csrfToken);
|
|
164
181
|
this.signUp = new import_internal.SignUp(this.auth);
|
|
182
|
+
import_events.eventBus.on(import_events.events.SessionChanged, () => {
|
|
183
|
+
this.#setCreatedActiveSession(this.user || null);
|
|
184
|
+
this.#emit();
|
|
185
|
+
});
|
|
165
186
|
this.#setStatus("ready");
|
|
166
187
|
this.#publicEventBus.emit(import_ternStatusEvent.ternEvents.Status, "ready");
|
|
167
188
|
return this;
|
|
@@ -186,6 +207,35 @@ class TernSecureAuth {
|
|
|
186
207
|
this.#configureEmulator();
|
|
187
208
|
(0, import_installations.getInstallations)(this.firebaseClientApp);
|
|
188
209
|
}
|
|
210
|
+
/**
|
|
211
|
+
* use when cookie are not httpOnly
|
|
212
|
+
*/
|
|
213
|
+
initClient = () => {
|
|
214
|
+
var _a;
|
|
215
|
+
const idTokenInCookie = (_a = this.#authCookieManager) == null ? void 0 : _a.getIdTokenCookie();
|
|
216
|
+
const jwtClient = (0, import_jwtClient.createClientFromJwt)(idTokenInCookie || null);
|
|
217
|
+
this.user = jwtClient;
|
|
218
|
+
this.#emit();
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* @deprecated will be removed in future releases.
|
|
222
|
+
*/
|
|
223
|
+
initClientAuthRequest = () => {
|
|
224
|
+
var _a;
|
|
225
|
+
(_a = this.#clientAuthRequest) == null ? void 0 : _a.getIdTokenFromCookie().then((idTokenInCookie) => {
|
|
226
|
+
const { token } = idTokenInCookie;
|
|
227
|
+
const jwtClient = (0, import_jwtClient.createClientFromJwt)(token || null);
|
|
228
|
+
this.user = jwtClient;
|
|
229
|
+
this.#emit();
|
|
230
|
+
}).catch((error) => {
|
|
231
|
+
console.error(
|
|
232
|
+
"[ternauth] Error during client auth request initialization:",
|
|
233
|
+
error
|
|
234
|
+
);
|
|
235
|
+
this.user = null;
|
|
236
|
+
this.#emit();
|
|
237
|
+
});
|
|
238
|
+
};
|
|
189
239
|
signOut = async (options) => {
|
|
190
240
|
const redirectUrl = (options == null ? void 0 : options.redirectUrl) || this.#constructAfterSignOutUrl();
|
|
191
241
|
if (options == null ? void 0 : options.onBeforeSignOut) {
|
|
@@ -199,16 +249,29 @@ class TernSecureAuth {
|
|
|
199
249
|
window.location.href = redirectUrl;
|
|
200
250
|
}
|
|
201
251
|
import_events.eventBus.emit(import_events.events.UserSignOut, null);
|
|
202
|
-
import_events.eventBus.emit(import_events.events.
|
|
252
|
+
import_events.eventBus.emit(import_events.events.TokenUpdate, { token: null });
|
|
203
253
|
this.#emit();
|
|
204
254
|
};
|
|
205
255
|
get currentSession() {
|
|
206
256
|
return this.signedInSession;
|
|
207
257
|
}
|
|
258
|
+
initAuthListener() {
|
|
259
|
+
(async () => {
|
|
260
|
+
await this.auth.authStateReady();
|
|
261
|
+
const user = this.auth.currentUser;
|
|
262
|
+
this._currentUser = user;
|
|
263
|
+
this.user = user;
|
|
264
|
+
await this.updateCurrentSession();
|
|
265
|
+
this.#emit();
|
|
266
|
+
})();
|
|
267
|
+
return () => {
|
|
268
|
+
};
|
|
269
|
+
}
|
|
208
270
|
initAuthStateListener() {
|
|
209
271
|
return (0, import_auth.onAuthStateChanged)(this.auth, async (user) => {
|
|
210
272
|
await this.auth.authStateReady();
|
|
211
273
|
this._currentUser = user;
|
|
274
|
+
this.user = user;
|
|
212
275
|
await this.updateCurrentSession();
|
|
213
276
|
this.#emit();
|
|
214
277
|
});
|
|
@@ -217,10 +280,18 @@ class TernSecureAuth {
|
|
|
217
280
|
return (0, import_auth.onIdTokenChanged)(this.auth, async (user) => {
|
|
218
281
|
await this.auth.authStateReady();
|
|
219
282
|
this._currentUser = user;
|
|
283
|
+
this.user = user;
|
|
220
284
|
await this.updateCurrentSession();
|
|
221
285
|
this.#emit();
|
|
222
286
|
});
|
|
223
287
|
}
|
|
288
|
+
async getIdToken() {
|
|
289
|
+
await this.auth.authStateReady();
|
|
290
|
+
if (!this.auth.currentUser) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
return (0, import_auth.getIdToken)(this.auth.currentUser);
|
|
294
|
+
}
|
|
224
295
|
onAuthStateChanged(callback) {
|
|
225
296
|
return (0, import_auth.onAuthStateChanged)(this.auth, callback);
|
|
226
297
|
}
|
|
@@ -241,7 +312,8 @@ class TernSecureAuth {
|
|
|
241
312
|
issuedAtTime: res.issuedAtTime,
|
|
242
313
|
expirationTime: res.expirationTime,
|
|
243
314
|
authTime: res.authTime,
|
|
244
|
-
signInProvider: res.signInProvider || "unknown"
|
|
315
|
+
signInProvider: res.signInProvider || "unknown",
|
|
316
|
+
signInSecondFactor: res.signInSecondFactor
|
|
245
317
|
};
|
|
246
318
|
} catch (error) {
|
|
247
319
|
console.error("[TernSecureAuth] Error updating session:", error);
|
|
@@ -253,7 +325,7 @@ class TernSecureAuth {
|
|
|
253
325
|
const result = await (0, import_auth.getRedirectResult)(this.auth);
|
|
254
326
|
if (result) {
|
|
255
327
|
return {
|
|
256
|
-
|
|
328
|
+
status: "success",
|
|
257
329
|
user: result.user
|
|
258
330
|
};
|
|
259
331
|
}
|
|
@@ -261,10 +333,9 @@ class TernSecureAuth {
|
|
|
261
333
|
} catch (error) {
|
|
262
334
|
const authError = (0, import_errors.handleFirebaseAuthError)(error);
|
|
263
335
|
return {
|
|
264
|
-
|
|
336
|
+
status: "error",
|
|
265
337
|
message: authError.message,
|
|
266
|
-
error: authError.code
|
|
267
|
-
user: null
|
|
338
|
+
error: authError.code
|
|
268
339
|
};
|
|
269
340
|
}
|
|
270
341
|
}
|
|
@@ -290,6 +361,24 @@ class TernSecureAuth {
|
|
|
290
361
|
off = (...args) => {
|
|
291
362
|
this.#publicEventBus.off(...args);
|
|
292
363
|
};
|
|
364
|
+
createActiveSession = async ({
|
|
365
|
+
session,
|
|
366
|
+
redirectUrl
|
|
367
|
+
}) => {
|
|
368
|
+
try {
|
|
369
|
+
if (!session) {
|
|
370
|
+
throw new Error("No session provided to createActiveSession");
|
|
371
|
+
}
|
|
372
|
+
const sessionResult = await session.getIdTokenResult();
|
|
373
|
+
const sessionData = new import_internal.Session(sessionResult);
|
|
374
|
+
await sessionData.create(this.csrfToken || "");
|
|
375
|
+
await this.redirectAfterSignIn();
|
|
376
|
+
this.#setCreatedActiveSession(session);
|
|
377
|
+
this.#emit();
|
|
378
|
+
} catch (error) {
|
|
379
|
+
console.error("[TernSecureAuth] Error creating active session:", error);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
293
382
|
initialize(options) {
|
|
294
383
|
this._initialize(options);
|
|
295
384
|
return Promise.resolve();
|
|
@@ -372,9 +461,9 @@ class TernSecureAuth {
|
|
|
372
461
|
if (effectiveRedirectUrl) {
|
|
373
462
|
if (inBrowser()) {
|
|
374
463
|
const absoluteRedirectUrl = new URL(effectiveRedirectUrl, window.location.origin).href;
|
|
375
|
-
(_a = paramsForBuildUrl.searchParams) == null ? void 0 : _a.set("
|
|
464
|
+
(_a = paramsForBuildUrl.searchParams) == null ? void 0 : _a.set("redirect_url", absoluteRedirectUrl);
|
|
376
465
|
} else {
|
|
377
|
-
(_b = paramsForBuildUrl.searchParams) == null ? void 0 : _b.set("
|
|
466
|
+
(_b = paramsForBuildUrl.searchParams) == null ? void 0 : _b.set("redirect_url", effectiveRedirectUrl);
|
|
378
467
|
}
|
|
379
468
|
}
|
|
380
469
|
const constructedUrl = (0, import_construct.buildURL)(paramsForBuildUrl, {
|
|
@@ -467,13 +556,11 @@ class TernSecureAuth {
|
|
|
467
556
|
};
|
|
468
557
|
};
|
|
469
558
|
#emit = () => {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
});
|
|
476
|
-
}
|
|
559
|
+
for (const listener of this.#listeners) {
|
|
560
|
+
listener({
|
|
561
|
+
user: this.user,
|
|
562
|
+
session: this.signedInSession
|
|
563
|
+
});
|
|
477
564
|
}
|
|
478
565
|
};
|
|
479
566
|
#setStatus(newStatus) {
|
|
@@ -485,8 +572,11 @@ class TernSecureAuth {
|
|
|
485
572
|
}
|
|
486
573
|
}
|
|
487
574
|
}
|
|
575
|
+
#setCreatedActiveSession = (session) => {
|
|
576
|
+
this.user = session;
|
|
577
|
+
};
|
|
488
578
|
#setPersistence = () => {
|
|
489
|
-
const persistenceType = this.#options.persistence
|
|
579
|
+
const persistenceType = this.#options.persistence;
|
|
490
580
|
switch (persistenceType) {
|
|
491
581
|
case "browserCookie":
|
|
492
582
|
return import_auth.inMemoryPersistence;
|