@zudojs/auth 0.0.1
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/README.md +37 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/authErrors/authError.base.d.ts +77 -0
- package/dist/authErrors/authError.base.d.ts.map +1 -0
- package/dist/authErrors/authError.base.js +108 -0
- package/dist/authErrors/authError.base.js.map +1 -0
- package/dist/authErrors/index.d.ts +7 -0
- package/dist/authErrors/index.d.ts.map +1 -0
- package/dist/authErrors/index.js +7 -0
- package/dist/authErrors/index.js.map +1 -0
- package/dist/authPassword/authPassword.core.d.ts +39 -0
- package/dist/authPassword/authPassword.core.d.ts.map +1 -0
- package/dist/authPassword/authPassword.core.js +86 -0
- package/dist/authPassword/authPassword.core.js.map +1 -0
- package/dist/authPassword/index.d.ts +7 -0
- package/dist/authPassword/index.d.ts.map +1 -0
- package/dist/authPassword/index.js +7 -0
- package/dist/authPassword/index.js.map +1 -0
- package/dist/authProvider/authProvider.core.d.ts +62 -0
- package/dist/authProvider/authProvider.core.d.ts.map +1 -0
- package/dist/authProvider/authProvider.core.js +125 -0
- package/dist/authProvider/authProvider.core.js.map +1 -0
- package/dist/authProvider/index.d.ts +7 -0
- package/dist/authProvider/index.d.ts.map +1 -0
- package/dist/authProvider/index.js +7 -0
- package/dist/authProvider/index.js.map +1 -0
- package/dist/authSession/authSession.core.d.ts +16 -0
- package/dist/authSession/authSession.core.d.ts.map +1 -0
- package/dist/authSession/authSession.core.js +73 -0
- package/dist/authSession/authSession.core.js.map +1 -0
- package/dist/authSession/index.d.ts +7 -0
- package/dist/authSession/index.d.ts.map +1 -0
- package/dist/authSession/index.js +7 -0
- package/dist/authSession/index.js.map +1 -0
- package/dist/authToken/authToken.core.d.ts +31 -0
- package/dist/authToken/authToken.core.d.ts.map +1 -0
- package/dist/authToken/authToken.core.js +69 -0
- package/dist/authToken/authToken.core.js.map +1 -0
- package/dist/authToken/authToken.signing.d.ts +21 -0
- package/dist/authToken/authToken.signing.d.ts.map +1 -0
- package/dist/authToken/authToken.signing.js +87 -0
- package/dist/authToken/authToken.signing.js.map +1 -0
- package/dist/authToken/index.d.ts +7 -0
- package/dist/authToken/index.d.ts.map +1 -0
- package/dist/authToken/index.js +7 -0
- package/dist/authToken/index.js.map +1 -0
- package/dist/authToken/jwt.namespace.d.ts +18 -0
- package/dist/authToken/jwt.namespace.d.ts.map +1 -0
- package/dist/authToken/jwt.namespace.js +17 -0
- package/dist/authToken/jwt.namespace.js.map +1 -0
- package/dist/authTypes/authRbac.type.d.ts +45 -0
- package/dist/authTypes/authRbac.type.d.ts.map +1 -0
- package/dist/authTypes/authRbac.type.js +10 -0
- package/dist/authTypes/authRbac.type.js.map +1 -0
- package/dist/authTypes/authSession.type.d.ts +57 -0
- package/dist/authTypes/authSession.type.d.ts.map +1 -0
- package/dist/authTypes/authSession.type.js +7 -0
- package/dist/authTypes/authSession.type.js.map +1 -0
- package/dist/authTypes/authStrategy.type.d.ts +83 -0
- package/dist/authTypes/authStrategy.type.d.ts.map +1 -0
- package/dist/authTypes/authStrategy.type.js +7 -0
- package/dist/authTypes/authStrategy.type.js.map +1 -0
- package/dist/authTypes/authToken.type.d.ts +72 -0
- package/dist/authTypes/authToken.type.d.ts.map +1 -0
- package/dist/authTypes/authToken.type.js +7 -0
- package/dist/authTypes/authToken.type.js.map +1 -0
- package/dist/authTypes/authUser.type.d.ts +47 -0
- package/dist/authTypes/authUser.type.d.ts.map +1 -0
- package/dist/authTypes/authUser.type.js +7 -0
- package/dist/authTypes/authUser.type.js.map +1 -0
- package/dist/authTypes/index.d.ts +11 -0
- package/dist/authTypes/index.d.ts.map +1 -0
- package/dist/authTypes/index.js +11 -0
- package/dist/authTypes/index.js.map +1 -0
- package/dist/authUtils/authUtils.helper.d.ts +40 -0
- package/dist/authUtils/authUtils.helper.d.ts.map +1 -0
- package/dist/authUtils/authUtils.helper.js +84 -0
- package/dist/authUtils/authUtils.helper.js.map +1 -0
- package/dist/authUtils/index.d.ts +7 -0
- package/dist/authUtils/index.d.ts.map +1 -0
- package/dist/authUtils/index.js +7 -0
- package/dist/authUtils/index.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT token creation, verification, and refresh.
|
|
3
|
+
*
|
|
4
|
+
* @module authToken/authToken
|
|
5
|
+
*
|
|
6
|
+
* Pure Node.js implementation (no jsonwebtoken dependency).
|
|
7
|
+
* Uses HMAC SHA-256 for signing.
|
|
8
|
+
*/
|
|
9
|
+
import type { UserId } from "@zudojs/constants";
|
|
10
|
+
import type { JwtToken, TokenPair, TokenConfig, TokenVerificationResult } from "../authTypes/authToken.type.js";
|
|
11
|
+
/**
|
|
12
|
+
* Create a new token pair (access + refresh).
|
|
13
|
+
*/
|
|
14
|
+
export declare function createTokenPair(userId: UserId, config: TokenConfig, options?: {
|
|
15
|
+
readonly roles?: readonly string[];
|
|
16
|
+
}): TokenPair;
|
|
17
|
+
/**
|
|
18
|
+
* Verify and decode an access token.
|
|
19
|
+
*/
|
|
20
|
+
export declare function verifyAccessToken(token: JwtToken, config: TokenConfig): TokenVerificationResult;
|
|
21
|
+
/**
|
|
22
|
+
* Verify and decode a refresh token.
|
|
23
|
+
*/
|
|
24
|
+
export declare function verifyRefreshToken(token: JwtToken, config: TokenConfig): TokenVerificationResult;
|
|
25
|
+
/**
|
|
26
|
+
* Refresh an access token using a valid refresh token.
|
|
27
|
+
*/
|
|
28
|
+
export declare function refreshAccessToken(refreshToken: JwtToken, config: TokenConfig, options?: {
|
|
29
|
+
readonly roles?: readonly string[];
|
|
30
|
+
}): TokenPair | null;
|
|
31
|
+
//# sourceMappingURL=authToken.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.core.d.ts","sourceRoot":"","sources":["../../src/authToken/authToken.core.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAUxC;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/C,SAAS,CAsCX;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,WAAW,GAClB,uBAAuB,CAEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,WAAW,GAClB,uBAAuB,CAEzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,QAAQ,EACtB,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC/C,SAAS,GAAG,IAAI,CAOlB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT token creation, verification, and refresh.
|
|
3
|
+
*
|
|
4
|
+
* @module authToken/authToken
|
|
5
|
+
*
|
|
6
|
+
* Pure Node.js implementation (no jsonwebtoken dependency).
|
|
7
|
+
* Uses HMAC SHA-256 for signing.
|
|
8
|
+
*/
|
|
9
|
+
import { TimeMs } from "@zudojs/constants";
|
|
10
|
+
import { signToken, verifyToken, generateTokenId, } from "./authToken.signing.js";
|
|
11
|
+
const DEFAULT_ACCESS_TTL = TimeMs.SECOND * 15; // 15 minutes
|
|
12
|
+
const DEFAULT_REFRESH_TTL = TimeMs.SECOND * 60 * 60 * 24 * 7; // 7 days
|
|
13
|
+
/**
|
|
14
|
+
* Create a new token pair (access + refresh).
|
|
15
|
+
*/
|
|
16
|
+
export function createTokenPair(userId, config, options) {
|
|
17
|
+
const accessTtl = config.accessTtl ?? DEFAULT_ACCESS_TTL;
|
|
18
|
+
const refreshTtl = config.refreshTtl ?? DEFAULT_REFRESH_TTL;
|
|
19
|
+
const now = Math.floor(Date.now() / 1000);
|
|
20
|
+
const accessToken = signToken({
|
|
21
|
+
sub: userId,
|
|
22
|
+
iat: now,
|
|
23
|
+
exp: now + accessTtl,
|
|
24
|
+
typ: "access",
|
|
25
|
+
jti: generateTokenId(),
|
|
26
|
+
roles: options?.roles,
|
|
27
|
+
...(config.issuer ? { iss: config.issuer } : {}),
|
|
28
|
+
...(config.audience ? { aud: config.audience } : {}),
|
|
29
|
+
}, config.accessSecret);
|
|
30
|
+
const refreshToken = signToken({
|
|
31
|
+
sub: userId,
|
|
32
|
+
iat: now,
|
|
33
|
+
exp: now + refreshTtl,
|
|
34
|
+
typ: "refresh",
|
|
35
|
+
jti: generateTokenId(),
|
|
36
|
+
...(config.issuer ? { iss: config.issuer } : {}),
|
|
37
|
+
...(config.audience ? { aud: config.audience } : {}),
|
|
38
|
+
}, config.refreshSecret);
|
|
39
|
+
return {
|
|
40
|
+
accessToken,
|
|
41
|
+
refreshToken,
|
|
42
|
+
expiresIn: accessTtl,
|
|
43
|
+
tokenType: "Bearer",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Verify and decode an access token.
|
|
48
|
+
*/
|
|
49
|
+
export function verifyAccessToken(token, config) {
|
|
50
|
+
return verifyToken(token, config.accessSecret, "access", config);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Verify and decode a refresh token.
|
|
54
|
+
*/
|
|
55
|
+
export function verifyRefreshToken(token, config) {
|
|
56
|
+
return verifyToken(token, config.refreshSecret, "refresh", config);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Refresh an access token using a valid refresh token.
|
|
60
|
+
*/
|
|
61
|
+
export function refreshAccessToken(refreshToken, config, options) {
|
|
62
|
+
const result = verifyRefreshToken(refreshToken, config);
|
|
63
|
+
if (!result.valid || !result.payload)
|
|
64
|
+
return null;
|
|
65
|
+
return createTokenPair(result.payload.sub, config, {
|
|
66
|
+
roles: options?.roles ?? result.payload.roles,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=authToken.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.core.js","sourceRoot":"","sources":["../../src/authToken/authToken.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal JWT signing and verification helpers.
|
|
3
|
+
*
|
|
4
|
+
* @module authToken/authToken.signing
|
|
5
|
+
*
|
|
6
|
+
* Not exported from the package barrel — used internally by authToken.core.ts.
|
|
7
|
+
*/
|
|
8
|
+
import type { JwtToken, TokenId, TokenPayload, TokenConfig, TokenVerificationResult } from "../authTypes/authToken.type.js";
|
|
9
|
+
/**
|
|
10
|
+
* Sign a JWT payload with HMAC SHA-256.
|
|
11
|
+
*/
|
|
12
|
+
export declare function signToken(payload: TokenPayload, secret: string): JwtToken;
|
|
13
|
+
/**
|
|
14
|
+
* Verify a JWT token's signature, expiration, and type.
|
|
15
|
+
*/
|
|
16
|
+
export declare function verifyToken(token: JwtToken, secret: string, expectedType: "access" | "refresh", config: TokenConfig): TokenVerificationResult;
|
|
17
|
+
/**
|
|
18
|
+
* Generate a random token ID.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateTokenId(): TokenId;
|
|
21
|
+
//# sourceMappingURL=authToken.signing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.signing.d.ts","sourceRoot":"","sources":["../../src/authToken/authToken.signing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,WAAW,EACX,uBAAuB,EACxB,MAAM,gCAAgC,CAAC;AAKxC;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAQzE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,QAAQ,GAAG,SAAS,EAClC,MAAM,EAAE,WAAW,GAClB,uBAAuB,CA0CzB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal JWT signing and verification helpers.
|
|
3
|
+
*
|
|
4
|
+
* @module authToken/authToken.signing
|
|
5
|
+
*
|
|
6
|
+
* Not exported from the package barrel — used internally by authToken.core.ts.
|
|
7
|
+
*/
|
|
8
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
9
|
+
import { randomBytes } from "node:crypto";
|
|
10
|
+
/** HMAC signing algorithm. */
|
|
11
|
+
const ALGORITHM = "HS256";
|
|
12
|
+
/**
|
|
13
|
+
* Sign a JWT payload with HMAC SHA-256.
|
|
14
|
+
*/
|
|
15
|
+
export function signToken(payload, secret) {
|
|
16
|
+
const header = base64UrlEncode(JSON.stringify({ alg: ALGORITHM, typ: "JWT" }));
|
|
17
|
+
const body = base64UrlEncode(JSON.stringify(payload));
|
|
18
|
+
const signatureInput = `${header}.${body}`;
|
|
19
|
+
const signature = hmacSha256(signatureInput, secret);
|
|
20
|
+
return `${signatureInput}.${signature}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Verify a JWT token's signature, expiration, and type.
|
|
24
|
+
*/
|
|
25
|
+
export function verifyToken(token, secret, expectedType, config) {
|
|
26
|
+
const parts = token.split(".");
|
|
27
|
+
if (parts.length !== 3) {
|
|
28
|
+
return { valid: false, error: "Invalid token format" };
|
|
29
|
+
}
|
|
30
|
+
const [headerB64, bodyB64, signature] = parts;
|
|
31
|
+
const signatureInput = `${headerB64}.${bodyB64}`;
|
|
32
|
+
const expectedSignature = hmacSha256(signatureInput, secret);
|
|
33
|
+
const sigBuffer = Buffer.from(signature ?? "", "hex");
|
|
34
|
+
const expectedBuffer = Buffer.from(expectedSignature, "hex");
|
|
35
|
+
if (sigBuffer.length !== expectedBuffer.length ||
|
|
36
|
+
!timingSafeEqual(sigBuffer, expectedBuffer)) {
|
|
37
|
+
return { valid: false, error: "Invalid signature" };
|
|
38
|
+
}
|
|
39
|
+
let payload;
|
|
40
|
+
try {
|
|
41
|
+
payload = JSON.parse(base64UrlDecode(bodyB64));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { valid: false, error: "Invalid payload" };
|
|
45
|
+
}
|
|
46
|
+
const now = Math.floor(Date.now() / 1000);
|
|
47
|
+
if (payload.exp < now) {
|
|
48
|
+
return { valid: false, error: "Token expired" };
|
|
49
|
+
}
|
|
50
|
+
if (payload.typ !== expectedType) {
|
|
51
|
+
return { valid: false, error: `Expected ${expectedType} token` };
|
|
52
|
+
}
|
|
53
|
+
if (config.issuer && payload.iss !== config.issuer) {
|
|
54
|
+
return { valid: false, error: "Invalid issuer" };
|
|
55
|
+
}
|
|
56
|
+
return { valid: true, payload };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a random token ID.
|
|
60
|
+
*/
|
|
61
|
+
export function generateTokenId() {
|
|
62
|
+
return randomBytes(16).toString("hex");
|
|
63
|
+
}
|
|
64
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────
|
|
65
|
+
function hmacSha256(data, secret) {
|
|
66
|
+
return createHmac("sha256", secret).update(data).digest("hex");
|
|
67
|
+
}
|
|
68
|
+
function base64UrlEncode(data) {
|
|
69
|
+
const encoded = Buffer.from(data).toString("base64");
|
|
70
|
+
let result = "";
|
|
71
|
+
for (let i = 0; i < encoded.length; i++) {
|
|
72
|
+
const char = encoded[i];
|
|
73
|
+
if (char === "+")
|
|
74
|
+
result += "-";
|
|
75
|
+
else if (char === "/")
|
|
76
|
+
result += "_";
|
|
77
|
+
else if (char !== "=")
|
|
78
|
+
result += char;
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function base64UrlDecode(data) {
|
|
83
|
+
const padded = data.replace(/-/g, "+").replace(/_/g, "/");
|
|
84
|
+
const padLength = (4 - (padded.length % 4)) % 4;
|
|
85
|
+
return Buffer.from(padded + "=".repeat(padLength), "base64").toString("utf-8");
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=authToken.signing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.signing.js","sourceRoot":"","sources":["../../src/authToken/authToken.signing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authToken/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authToken/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/auth — JWT Namespace
|
|
3
|
+
*
|
|
4
|
+
* Convenience namespace for all JWT-related utilities.
|
|
5
|
+
*/
|
|
6
|
+
import { createTokenPair, verifyAccessToken, verifyRefreshToken, refreshAccessToken } from "./authToken.core.js";
|
|
7
|
+
import { parseBearerToken, isTokenExpired, extractUserId } from "../authUtils/authUtils.helper.js";
|
|
8
|
+
export type { JwtToken, TokenPair, TokenConfig, TokenVerificationResult, } from "../authTypes/authToken.type.js";
|
|
9
|
+
export declare const jwt: {
|
|
10
|
+
createTokenPair: typeof createTokenPair;
|
|
11
|
+
verifyAccessToken: typeof verifyAccessToken;
|
|
12
|
+
verifyRefreshToken: typeof verifyRefreshToken;
|
|
13
|
+
refreshAccessToken: typeof refreshAccessToken;
|
|
14
|
+
parseBearerToken: typeof parseBearerToken;
|
|
15
|
+
isTokenExpired: typeof isTokenExpired;
|
|
16
|
+
extractUserId: typeof extractUserId;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=jwt.namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.namespace.d.ts","sourceRoot":"","sources":["../../src/authToken/jwt.namespace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACd,MAAM,kCAAkC,CAAC;AAE1C,YAAY,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,GAAG;;;;;;;;CAQf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zudojs/auth — JWT Namespace
|
|
3
|
+
*
|
|
4
|
+
* Convenience namespace for all JWT-related utilities.
|
|
5
|
+
*/
|
|
6
|
+
import { createTokenPair, verifyAccessToken, verifyRefreshToken, refreshAccessToken, } from "./authToken.core.js";
|
|
7
|
+
import { parseBearerToken, isTokenExpired, extractUserId, } from "../authUtils/authUtils.helper.js";
|
|
8
|
+
export const jwt = {
|
|
9
|
+
createTokenPair,
|
|
10
|
+
verifyAccessToken,
|
|
11
|
+
verifyRefreshToken,
|
|
12
|
+
refreshAccessToken,
|
|
13
|
+
parseBearerToken,
|
|
14
|
+
isTokenExpired,
|
|
15
|
+
extractUserId,
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=jwt.namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.namespace.js","sourceRoot":"","sources":["../../src/authToken/jwt.namespace.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,kCAAkC,CAAC;AAS1C,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,eAAe;IACf,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,aAAa;CACd,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role-based access control (RBAC) types.
|
|
3
|
+
*
|
|
4
|
+
* @module authRbac
|
|
5
|
+
*
|
|
6
|
+
* Re-exported from @zudojs/permissions for backward compatibility.
|
|
7
|
+
* For new code, import directly from @zudojs/permissions.
|
|
8
|
+
*/
|
|
9
|
+
import type { PermissionString as PermissionsPermissionString, RoleDefinition as PermissionsRole } from "@zudojs/permissions";
|
|
10
|
+
/**
|
|
11
|
+
* Permission string format: "resource:action"
|
|
12
|
+
* Examples: "users:read", "posts:write", "admin:*"
|
|
13
|
+
*/
|
|
14
|
+
export type Permission = PermissionsPermissionString;
|
|
15
|
+
/**
|
|
16
|
+
* Role definition with associated permissions.
|
|
17
|
+
*/
|
|
18
|
+
export type Role = PermissionsRole;
|
|
19
|
+
/**
|
|
20
|
+
* Guard result after checking permissions.
|
|
21
|
+
*/
|
|
22
|
+
export interface GuardResult {
|
|
23
|
+
/** Whether access is allowed */
|
|
24
|
+
readonly allowed: boolean;
|
|
25
|
+
/** Reason for denial (if denied) */
|
|
26
|
+
readonly reason?: string;
|
|
27
|
+
/** Required permission that was missing */
|
|
28
|
+
readonly requiredPermission?: Permission;
|
|
29
|
+
/** User's roles at time of check */
|
|
30
|
+
readonly userRoles?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Guard context for authorization checks.
|
|
34
|
+
*/
|
|
35
|
+
export interface GuardContext {
|
|
36
|
+
/** User ID to check */
|
|
37
|
+
readonly userId: string;
|
|
38
|
+
/** User's roles */
|
|
39
|
+
readonly roles: readonly string[];
|
|
40
|
+
/** Required permission */
|
|
41
|
+
readonly permission: Permission;
|
|
42
|
+
/** Optional resource owner ID (for ownership checks) */
|
|
43
|
+
readonly resourceOwnerId?: string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=authRbac.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authRbac.type.d.ts","sourceRoot":"","sources":["../../src/authTypes/authRbac.type.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,gBAAgB,IAAI,2BAA2B,EAC/C,cAAc,IAAI,eAAe,EAClC,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,eAAe,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC;IACzC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mBAAmB;IACnB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0BAA0B;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,wDAAwD;IACxD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role-based access control (RBAC) types.
|
|
3
|
+
*
|
|
4
|
+
* @module authRbac
|
|
5
|
+
*
|
|
6
|
+
* Re-exported from @zudojs/permissions for backward compatibility.
|
|
7
|
+
* For new code, import directly from @zudojs/permissions.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=authRbac.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authRbac.type.js","sourceRoot":"","sources":["../../src/authTypes/authRbac.type.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* @module authSession/authSession
|
|
5
|
+
*/
|
|
6
|
+
import type { UserId } from "../authTypes/authUser.type.js";
|
|
7
|
+
import type { SessionId } from "@zudojs/constants";
|
|
8
|
+
export type { SessionId } from "@zudojs/constants";
|
|
9
|
+
/**
|
|
10
|
+
* Server-side session representation.
|
|
11
|
+
*/
|
|
12
|
+
export interface AuthSession {
|
|
13
|
+
/** Unique session identifier */
|
|
14
|
+
readonly id: SessionId;
|
|
15
|
+
/** User who owns this session */
|
|
16
|
+
readonly userId: UserId;
|
|
17
|
+
/** Client user-agent string */
|
|
18
|
+
readonly userAgent?: string;
|
|
19
|
+
/** Client IP address */
|
|
20
|
+
readonly ip?: string;
|
|
21
|
+
/** Session creation time */
|
|
22
|
+
readonly createdAt: Date;
|
|
23
|
+
/** Last activity time */
|
|
24
|
+
readonly lastActivityAt: Date;
|
|
25
|
+
/** Session expiration time */
|
|
26
|
+
readonly expiresAt: Date;
|
|
27
|
+
/** Whether the session is active */
|
|
28
|
+
readonly active: boolean;
|
|
29
|
+
/** Session metadata */
|
|
30
|
+
readonly metadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Options for creating a session.
|
|
34
|
+
*/
|
|
35
|
+
export interface CreateSessionOptions {
|
|
36
|
+
readonly userId: UserId;
|
|
37
|
+
readonly userAgent?: string;
|
|
38
|
+
readonly ip?: string;
|
|
39
|
+
readonly ttlSeconds?: number;
|
|
40
|
+
readonly metadata?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Session store interface.
|
|
44
|
+
*/
|
|
45
|
+
export interface SessionStore {
|
|
46
|
+
/** Create a new session */
|
|
47
|
+
create(options: CreateSessionOptions): Promise<AuthSession>;
|
|
48
|
+
/** Get a session by ID */
|
|
49
|
+
get(sessionId: SessionId): Promise<AuthSession | null>;
|
|
50
|
+
/** Update session activity */
|
|
51
|
+
touch(sessionId: SessionId): Promise<void>;
|
|
52
|
+
/** Destroy a session */
|
|
53
|
+
destroy(sessionId: SessionId): Promise<void>;
|
|
54
|
+
/** Destroy all sessions for a user */
|
|
55
|
+
destroyAllForUser(userId: UserId): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=authSession.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authSession.type.d.ts","sourceRoot":"","sources":["../../src/authTypes/authSession.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,yBAAyB;IACzB,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC;IAC9B,8BAA8B;IAC9B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5D,0BAA0B;IAC1B,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvD,8BAA8B;IAC9B,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,wBAAwB;IACxB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,sCAAsC;IACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authSession.type.js","sourceRoot":"","sources":["../../src/authTypes/authSession.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication strategy types (OAuth2, social login, etc.).
|
|
3
|
+
*
|
|
4
|
+
* @module authStrategy/authStrategy
|
|
5
|
+
*/
|
|
6
|
+
import type { UserId } from "../authTypes/authUser.type.js";
|
|
7
|
+
/**
|
|
8
|
+
* Supported OAuth2 provider identifiers.
|
|
9
|
+
*/
|
|
10
|
+
export type OAuthProvider = "google" | "github" | "microsoft" | "apple" | "discord" | "custom";
|
|
11
|
+
/**
|
|
12
|
+
* OAuth2 provider configuration.
|
|
13
|
+
*/
|
|
14
|
+
export interface OAuthConfig {
|
|
15
|
+
/** Provider name */
|
|
16
|
+
readonly provider: OAuthProvider;
|
|
17
|
+
/** OAuth2 client ID */
|
|
18
|
+
readonly clientId: string;
|
|
19
|
+
/** OAuth2 client secret */
|
|
20
|
+
readonly clientSecret: string;
|
|
21
|
+
/** OAuth2 authorization URL */
|
|
22
|
+
readonly authorizeUrl: string;
|
|
23
|
+
/** OAuth2 token URL */
|
|
24
|
+
readonly tokenUrl: string;
|
|
25
|
+
/** OAuth2 user info URL */
|
|
26
|
+
readonly userInfoUrl: string;
|
|
27
|
+
/** Redirect URI after authorization */
|
|
28
|
+
readonly redirectUri: string;
|
|
29
|
+
/** Requested scopes */
|
|
30
|
+
readonly scopes?: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* User info returned from an OAuth2 provider.
|
|
34
|
+
*/
|
|
35
|
+
export interface OAuthUserInfo {
|
|
36
|
+
/** Provider's user ID */
|
|
37
|
+
readonly providerId: string;
|
|
38
|
+
/** Email address */
|
|
39
|
+
readonly email: string;
|
|
40
|
+
/** Display name */
|
|
41
|
+
readonly name?: string;
|
|
42
|
+
/** Avatar URL */
|
|
43
|
+
readonly avatarUrl?: string;
|
|
44
|
+
/** Raw provider data */
|
|
45
|
+
readonly raw?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Result of OAuth2 authentication.
|
|
49
|
+
*/
|
|
50
|
+
export interface OAuthResult {
|
|
51
|
+
/** Whether authentication succeeded */
|
|
52
|
+
readonly success: boolean;
|
|
53
|
+
/** Authenticated user ID (if success) */
|
|
54
|
+
readonly userId?: UserId;
|
|
55
|
+
/** Whether a new user was created */
|
|
56
|
+
readonly isNewUser?: boolean;
|
|
57
|
+
/** Error message (if failure) */
|
|
58
|
+
readonly error?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Authentication strategy interface.
|
|
62
|
+
* Each strategy (password, OAuth2, API key, etc.) implements this.
|
|
63
|
+
*/
|
|
64
|
+
export interface AuthStrategy {
|
|
65
|
+
/** Strategy identifier */
|
|
66
|
+
readonly name: string;
|
|
67
|
+
/** Authenticate with strategy-specific credentials */
|
|
68
|
+
authenticate(credentials: unknown): Promise<OAuthResult>;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Password strategy credentials.
|
|
72
|
+
*/
|
|
73
|
+
export interface PasswordCredentials {
|
|
74
|
+
readonly identifier: string;
|
|
75
|
+
readonly password: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* API key strategy credentials.
|
|
79
|
+
*/
|
|
80
|
+
export interface ApiKeyCredentials {
|
|
81
|
+
readonly apiKey: string;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=authStrategy.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authStrategy.type.d.ts","sourceRoot":"","sources":["../../src/authTypes/authStrategy.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,aAAa,GACvB,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,+BAA+B;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uCAAuC;IACvC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,oBAAoB;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,YAAY,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authStrategy.type.js","sourceRoot":"","sources":["../../src/authTypes/authStrategy.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT token types and interfaces.
|
|
3
|
+
*
|
|
4
|
+
* @module authToken/authToken
|
|
5
|
+
*/
|
|
6
|
+
import type { UserId } from "../authTypes/authUser.type.js";
|
|
7
|
+
import type { TokenId } from "@zudojs/constants";
|
|
8
|
+
/** JWT token string. */
|
|
9
|
+
export type JwtToken = string;
|
|
10
|
+
/** Token identifier. Re-exported from @zudojs/constants for type safety. */
|
|
11
|
+
export type { TokenId } from "@zudojs/constants";
|
|
12
|
+
/**
|
|
13
|
+
* Token payload embedded in JWT.
|
|
14
|
+
*/
|
|
15
|
+
export interface TokenPayload {
|
|
16
|
+
/** Subject (user ID) */
|
|
17
|
+
readonly sub: UserId;
|
|
18
|
+
/** Issued-at timestamp */
|
|
19
|
+
readonly iat: number;
|
|
20
|
+
/** Expiration timestamp */
|
|
21
|
+
readonly exp: number;
|
|
22
|
+
/** Token type: access or refresh */
|
|
23
|
+
readonly typ: "access" | "refresh";
|
|
24
|
+
/** Token ID for revocation */
|
|
25
|
+
readonly jti: TokenId;
|
|
26
|
+
/** User roles */
|
|
27
|
+
readonly roles?: readonly string[];
|
|
28
|
+
/** Custom claims */
|
|
29
|
+
readonly [key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Token pair returned after authentication.
|
|
33
|
+
*/
|
|
34
|
+
export interface TokenPair {
|
|
35
|
+
/** Short-lived access token */
|
|
36
|
+
readonly accessToken: JwtToken;
|
|
37
|
+
/** Long-lived refresh token */
|
|
38
|
+
readonly refreshToken: JwtToken;
|
|
39
|
+
/** Access token expiration in seconds */
|
|
40
|
+
readonly expiresIn: number;
|
|
41
|
+
/** Token type (always "Bearer") */
|
|
42
|
+
readonly tokenType: "Bearer";
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Configuration for token generation.
|
|
46
|
+
*/
|
|
47
|
+
export interface TokenConfig {
|
|
48
|
+
/** Secret key for signing (access tokens) */
|
|
49
|
+
readonly accessSecret: string;
|
|
50
|
+
/** Secret key for signing (refresh tokens) */
|
|
51
|
+
readonly refreshSecret: string;
|
|
52
|
+
/** Access token TTL in seconds (default: 900 = 15 min) */
|
|
53
|
+
readonly accessTtl?: number;
|
|
54
|
+
/** Refresh token TTL in seconds (default: 604800 = 7 days) */
|
|
55
|
+
readonly refreshTtl?: number;
|
|
56
|
+
/** JWT issuer */
|
|
57
|
+
readonly issuer?: string;
|
|
58
|
+
/** JWT audience */
|
|
59
|
+
readonly audience?: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of token verification.
|
|
63
|
+
*/
|
|
64
|
+
export interface TokenVerificationResult {
|
|
65
|
+
/** Whether the token is valid */
|
|
66
|
+
readonly valid: boolean;
|
|
67
|
+
/** Decoded payload (if valid) */
|
|
68
|
+
readonly payload?: TokenPayload;
|
|
69
|
+
/** Error message (if invalid) */
|
|
70
|
+
readonly error?: string;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=authToken.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.type.d.ts","sourceRoot":"","sources":["../../src/authTypes/authToken.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,wBAAwB;AACxB,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,4EAA4E;AAC5E,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CAAC;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,iBAAiB;IACjB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,oBAAoB;IACpB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/B,+BAA+B;IAC/B,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,8CAA8C;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB;IACjB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB;IACnB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,iCAAiC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authToken.type.js","sourceRoot":"","sources":["../../src/authTypes/authToken.type.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|