@aura-stack/jose 0.1.0-rc.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Auth Stack Js
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,43 @@
1
+ <div align="center">
2
+
3
+ <h1><b>@aura-stack/jose</b></h1>
4
+
5
+ **Type-safe JOSE utilities for JWT signing, verification, and encryption**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@aura-stack/jose.svg)](https://www.npmjs.com/package/@aura-stack/jose)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
9
+
10
+ [Official Docs](https://aura-stack-auth.vercel.app/docs) · [JOSE Package Docs](https://aura-stack-auth.vercel.app/docs/packages/jose)
11
+
12
+ </div>
13
+
14
+ ---
15
+
16
+ ## Overview
17
+
18
+ `@aura-stack/jose` is a lightweight, type-safe wrapper around the [`jose`](https://github.com/panva/jose) library.
19
+ It provides utilities for working with **JWS (signing)**, **JWE (encryption)**, and **JWTs**, offering a simplified, consistent API built for modern TypeScript environments.
20
+
21
+ This package is used internally by [`@aura-stack/auth`](https://www.npmjs.com/package/@aura-stack/auth) but can also be installed and used as a standalone module.
22
+
23
+ ## Features
24
+
25
+ - **JWT management** — Sign, verify, encrypt, and decrypt JWTs with ease.
26
+ - **Type-safe** — Built with modern TypeScript for full type inference.
27
+ - **Composable utilities** — Use `createJWS`, `createJWE`, and `createJWT` to simplify configuration.
28
+ - **Lightweight integration** — Minimal wrapper around `jose` for better DX without overhead.
29
+ - **Flexible algorithms** — Compatible with HMAC, RSA, and EC key types.
30
+
31
+ ## Documentation
32
+
33
+ Visit the [**official documentation website**](https://aura-stack-auth.vercel.app).
34
+
35
+ ## License
36
+
37
+ Licensed under the [MIT License](LICENSE). © [Aura Stack](https://github.com/aura-stack-ts)
38
+
39
+ ---
40
+
41
+ <p align="center">
42
+ Made with ❤️ by <a href="https://github.com/aura-stack-ts">Aura Stack team</a>
43
+ </p>
@@ -0,0 +1,33 @@
1
+ import {
2
+ createSecret
3
+ } from "./chunk-M4WAOCIJ.js";
4
+
5
+ // src/sign.ts
6
+ import crypto from "crypto";
7
+ import { jwtVerify, SignJWT } from "jose";
8
+ var signJWS = async (payload, secret) => {
9
+ const secretKey = createSecret(secret);
10
+ const jti = crypto.randomBytes(32).toString("base64");
11
+ return new SignJWT(payload).setProtectedHeader({ alg: "HS256", typ: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).sign(secretKey);
12
+ };
13
+ var verifyJWS = async (token, secret) => {
14
+ try {
15
+ const secretKey = createSecret(secret);
16
+ const { payload } = await jwtVerify(token, secretKey);
17
+ return payload;
18
+ } catch (error) {
19
+ throw new Error("Invalid JWS", { cause: error });
20
+ }
21
+ };
22
+ var createJWS = (secret) => {
23
+ return {
24
+ signJWS: (payload) => signJWS(payload, secret),
25
+ verifyJWS: (payload) => verifyJWS(payload, secret)
26
+ };
27
+ };
28
+
29
+ export {
30
+ signJWS,
31
+ verifyJWS,
32
+ createJWS
33
+ };
@@ -0,0 +1,15 @@
1
+ // src/secret.ts
2
+ var createSecret = (secret) => {
3
+ if (secret === void 0) throw new Error("Secret is required");
4
+ if (typeof secret === "string") {
5
+ if (new TextEncoder().encode(secret).byteLength < 32) {
6
+ throw new Error("Secret string must be at least 32 characters long");
7
+ }
8
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
9
+ }
10
+ return secret;
11
+ };
12
+
13
+ export {
14
+ createSecret
15
+ };
@@ -0,0 +1,27 @@
1
+ import {
2
+ createSecret
3
+ } from "./chunk-M4WAOCIJ.js";
4
+
5
+ // src/deriveKey.ts
6
+ import { hkdfSync } from "crypto";
7
+ var deriveKey = (secret, salt, info, length = 32) => {
8
+ try {
9
+ const key = hkdfSync("SHA256", secret, salt, info, length);
10
+ const derivedKey = Buffer.from(key);
11
+ return {
12
+ key,
13
+ derivedKey
14
+ };
15
+ } catch (error) {
16
+ throw new Error("Failed to create a derived key (HKDF)", { cause: error });
17
+ }
18
+ };
19
+ var createDeriveKey = (secret, salt, info, length = 32) => {
20
+ const secretKey = createSecret(secret);
21
+ return deriveKey(secretKey, salt ?? "Aura Jose secret salt", info ?? "Aura Jose secret derivation", length);
22
+ };
23
+
24
+ export {
25
+ deriveKey,
26
+ createDeriveKey
27
+ };
@@ -0,0 +1,33 @@
1
+ import {
2
+ createSecret
3
+ } from "./chunk-M4WAOCIJ.js";
4
+
5
+ // src/encrypt.ts
6
+ import crypto from "crypto";
7
+ import { EncryptJWT, jwtDecrypt } from "jose";
8
+ var encryptJWE = async (payload, secret) => {
9
+ const secretKey = createSecret(secret);
10
+ const jti = crypto.randomBytes(32).toString("base64");
11
+ return new EncryptJWT({ token: payload }).setProtectedHeader({ alg: "dir", enc: "A256GCM", typ: "JWT", cty: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).encrypt(secretKey);
12
+ };
13
+ var decryptJWE = async (token, secret) => {
14
+ try {
15
+ const secretKey = createSecret(secret);
16
+ const { payload } = await jwtDecrypt(token, secretKey);
17
+ return payload.token;
18
+ } catch (error) {
19
+ throw new Error("Invalid JWE", { cause: error });
20
+ }
21
+ };
22
+ var createJWE = (secret) => {
23
+ return {
24
+ encryptJWE: (payload) => encryptJWE(payload, secret),
25
+ decryptJWE: (payload) => decryptJWE(payload, secret)
26
+ };
27
+ };
28
+
29
+ export {
30
+ encryptJWE,
31
+ decryptJWE,
32
+ createJWE
33
+ };
@@ -0,0 +1,62 @@
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
+
20
+ // src/deriveKey.ts
21
+ var deriveKey_exports = {};
22
+ __export(deriveKey_exports, {
23
+ createDeriveKey: () => createDeriveKey,
24
+ deriveKey: () => deriveKey
25
+ });
26
+ module.exports = __toCommonJS(deriveKey_exports);
27
+ var import_node_crypto = require("crypto");
28
+
29
+ // src/secret.ts
30
+ var createSecret = (secret) => {
31
+ if (secret === void 0) throw new Error("Secret is required");
32
+ if (typeof secret === "string") {
33
+ if (new TextEncoder().encode(secret).byteLength < 32) {
34
+ throw new Error("Secret string must be at least 32 characters long");
35
+ }
36
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
37
+ }
38
+ return secret;
39
+ };
40
+
41
+ // src/deriveKey.ts
42
+ var deriveKey = (secret, salt, info, length = 32) => {
43
+ try {
44
+ const key = (0, import_node_crypto.hkdfSync)("SHA256", secret, salt, info, length);
45
+ const derivedKey = Buffer.from(key);
46
+ return {
47
+ key,
48
+ derivedKey
49
+ };
50
+ } catch (error) {
51
+ throw new Error("Failed to create a derived key (HKDF)", { cause: error });
52
+ }
53
+ };
54
+ var createDeriveKey = (secret, salt, info, length = 32) => {
55
+ const secretKey = createSecret(secret);
56
+ return deriveKey(secretKey, salt ?? "Aura Jose secret salt", info ?? "Aura Jose secret derivation", length);
57
+ };
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ createDeriveKey,
61
+ deriveKey
62
+ });
@@ -0,0 +1,3 @@
1
+ import 'node:crypto';
2
+ export { createDeriveKey, deriveKey } from './index.js';
3
+ import 'jose';
@@ -0,0 +1,9 @@
1
+ import {
2
+ createDeriveKey,
3
+ deriveKey
4
+ } from "./chunk-ODRHALUH.js";
5
+ import "./chunk-M4WAOCIJ.js";
6
+ export {
7
+ createDeriveKey,
8
+ deriveKey
9
+ };
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/encrypt.ts
31
+ var encrypt_exports = {};
32
+ __export(encrypt_exports, {
33
+ createJWE: () => createJWE,
34
+ decryptJWE: () => decryptJWE,
35
+ encryptJWE: () => encryptJWE
36
+ });
37
+ module.exports = __toCommonJS(encrypt_exports);
38
+ var import_node_crypto = __toESM(require("crypto"), 1);
39
+ var import_jose = require("jose");
40
+
41
+ // src/secret.ts
42
+ var createSecret = (secret) => {
43
+ if (secret === void 0) throw new Error("Secret is required");
44
+ if (typeof secret === "string") {
45
+ if (new TextEncoder().encode(secret).byteLength < 32) {
46
+ throw new Error("Secret string must be at least 32 characters long");
47
+ }
48
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
49
+ }
50
+ return secret;
51
+ };
52
+
53
+ // src/encrypt.ts
54
+ var encryptJWE = async (payload, secret) => {
55
+ const secretKey = createSecret(secret);
56
+ const jti = import_node_crypto.default.randomBytes(32).toString("base64");
57
+ return new import_jose.EncryptJWT({ token: payload }).setProtectedHeader({ alg: "dir", enc: "A256GCM", typ: "JWT", cty: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).encrypt(secretKey);
58
+ };
59
+ var decryptJWE = async (token, secret) => {
60
+ try {
61
+ const secretKey = createSecret(secret);
62
+ const { payload } = await (0, import_jose.jwtDecrypt)(token, secretKey);
63
+ return payload.token;
64
+ } catch (error) {
65
+ throw new Error("Invalid JWE", { cause: error });
66
+ }
67
+ };
68
+ var createJWE = (secret) => {
69
+ return {
70
+ encryptJWE: (payload) => encryptJWE(payload, secret),
71
+ decryptJWE: (payload) => decryptJWE(payload, secret)
72
+ };
73
+ };
74
+ // Annotate the CommonJS export names for ESM import in node:
75
+ 0 && (module.exports = {
76
+ createJWE,
77
+ decryptJWE,
78
+ encryptJWE
79
+ });
@@ -0,0 +1,3 @@
1
+ export { EncryptedPayload, createJWE, decryptJWE, encryptJWE } from './index.js';
2
+ import 'node:crypto';
3
+ import 'jose';
@@ -0,0 +1,11 @@
1
+ import {
2
+ createJWE,
3
+ decryptJWE,
4
+ encryptJWE
5
+ } from "./chunk-T7MMDRY3.js";
6
+ import "./chunk-M4WAOCIJ.js";
7
+ export {
8
+ createJWE,
9
+ decryptJWE,
10
+ encryptJWE
11
+ };
package/dist/index.cjs ADDED
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ createDeriveKey: () => createDeriveKey,
34
+ createJWE: () => createJWE,
35
+ createJWS: () => createJWS,
36
+ createJWT: () => createJWT,
37
+ decodeJWT: () => decodeJWT,
38
+ decryptJWE: () => decryptJWE,
39
+ deriveKey: () => deriveKey,
40
+ encodeJWT: () => encodeJWT,
41
+ encryptJWE: () => encryptJWE,
42
+ signJWS: () => signJWS,
43
+ verifyJWS: () => verifyJWS
44
+ });
45
+ module.exports = __toCommonJS(index_exports);
46
+
47
+ // src/encrypt.ts
48
+ var import_node_crypto = __toESM(require("crypto"), 1);
49
+ var import_jose = require("jose");
50
+
51
+ // src/secret.ts
52
+ var createSecret = (secret) => {
53
+ if (secret === void 0) throw new Error("Secret is required");
54
+ if (typeof secret === "string") {
55
+ if (new TextEncoder().encode(secret).byteLength < 32) {
56
+ throw new Error("Secret string must be at least 32 characters long");
57
+ }
58
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
59
+ }
60
+ return secret;
61
+ };
62
+
63
+ // src/encrypt.ts
64
+ var encryptJWE = async (payload, secret) => {
65
+ const secretKey = createSecret(secret);
66
+ const jti = import_node_crypto.default.randomBytes(32).toString("base64");
67
+ return new import_jose.EncryptJWT({ token: payload }).setProtectedHeader({ alg: "dir", enc: "A256GCM", typ: "JWT", cty: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).encrypt(secretKey);
68
+ };
69
+ var decryptJWE = async (token, secret) => {
70
+ try {
71
+ const secretKey = createSecret(secret);
72
+ const { payload } = await (0, import_jose.jwtDecrypt)(token, secretKey);
73
+ return payload.token;
74
+ } catch (error) {
75
+ throw new Error("Invalid JWE", { cause: error });
76
+ }
77
+ };
78
+ var createJWE = (secret) => {
79
+ return {
80
+ encryptJWE: (payload) => encryptJWE(payload, secret),
81
+ decryptJWE: (payload) => decryptJWE(payload, secret)
82
+ };
83
+ };
84
+
85
+ // src/sign.ts
86
+ var import_node_crypto2 = __toESM(require("crypto"), 1);
87
+ var import_jose2 = require("jose");
88
+ var signJWS = async (payload, secret) => {
89
+ const secretKey = createSecret(secret);
90
+ const jti = import_node_crypto2.default.randomBytes(32).toString("base64");
91
+ return new import_jose2.SignJWT(payload).setProtectedHeader({ alg: "HS256", typ: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).sign(secretKey);
92
+ };
93
+ var verifyJWS = async (token, secret) => {
94
+ try {
95
+ const secretKey = createSecret(secret);
96
+ const { payload } = await (0, import_jose2.jwtVerify)(token, secretKey);
97
+ return payload;
98
+ } catch (error) {
99
+ throw new Error("Invalid JWS", { cause: error });
100
+ }
101
+ };
102
+ var createJWS = (secret) => {
103
+ return {
104
+ signJWS: (payload) => signJWS(payload, secret),
105
+ verifyJWS: (payload) => verifyJWS(payload, secret)
106
+ };
107
+ };
108
+
109
+ // src/deriveKey.ts
110
+ var import_node_crypto3 = require("crypto");
111
+ var deriveKey = (secret, salt, info, length = 32) => {
112
+ try {
113
+ const key = (0, import_node_crypto3.hkdfSync)("SHA256", secret, salt, info, length);
114
+ const derivedKey = Buffer.from(key);
115
+ return {
116
+ key,
117
+ derivedKey
118
+ };
119
+ } catch (error) {
120
+ throw new Error("Failed to create a derived key (HKDF)", { cause: error });
121
+ }
122
+ };
123
+ var createDeriveKey = (secret, salt, info, length = 32) => {
124
+ const secretKey = createSecret(secret);
125
+ return deriveKey(secretKey, salt ?? "Aura Jose secret salt", info ?? "Aura Jose secret derivation", length);
126
+ };
127
+
128
+ // src/index.ts
129
+ var encodeJWT = async (token, secret) => {
130
+ try {
131
+ const { signJWS: signJWS2 } = createJWS(secret);
132
+ const { encryptJWE: encryptJWE2 } = createJWE(secret);
133
+ const signed = await signJWS2(token);
134
+ return await encryptJWE2(signed);
135
+ } catch (error) {
136
+ throw new Error("Failed to encode JWT", { cause: error });
137
+ }
138
+ };
139
+ var decodeJWT = async (token, secret) => {
140
+ try {
141
+ const { verifyJWS: verifyJWS2 } = createJWS(secret);
142
+ const { decryptJWE: decryptJWE2 } = createJWE(secret);
143
+ const decrypted = await decryptJWE2(token);
144
+ return await verifyJWS2(decrypted);
145
+ } catch (error) {
146
+ throw new Error("Failed to decode JWT", { cause: error });
147
+ }
148
+ };
149
+ var createJWT = (secret) => {
150
+ return {
151
+ encodeJWT: async (payload) => encodeJWT(payload, secret),
152
+ decodeJWT: async (token) => decodeJWT(token, secret)
153
+ };
154
+ };
155
+ // Annotate the CommonJS export names for ESM import in node:
156
+ 0 && (module.exports = {
157
+ createDeriveKey,
158
+ createJWE,
159
+ createJWS,
160
+ createJWT,
161
+ decodeJWT,
162
+ decryptJWE,
163
+ deriveKey,
164
+ encodeJWT,
165
+ encryptJWE,
166
+ signJWS,
167
+ verifyJWS
168
+ });
@@ -0,0 +1,145 @@
1
+ import { KeyObject, BinaryLike } from 'node:crypto';
2
+ import { JWTPayload } from 'jose';
3
+
4
+ /**
5
+ * Sign a standard JWT token with the following claims:
6
+ * - alg: algorithm used to sign the JWT
7
+ * - typ: type of the token
8
+ * - iat: time at which the JWT was issued
9
+ * - nbf: not before time of the JWT
10
+ * - exp: expiration time of the JWT
11
+ * - jti: unique identifier to avoid collisions
12
+ *
13
+ * @param payload - Payload data information to sign the JWT
14
+ * @param secret - Secret key to sign the JWT (CryptoKey, KeyObject, string or Uint8Array)
15
+ * @returns Signed JWT string
16
+ */
17
+ declare const signJWS: (payload: JWTPayload, secret: SecretInput) => Promise<string>;
18
+ /**
19
+ * Verify the integrity of a JWT token and return the payload if valid, rejecting
20
+ * tokens that use the "none" algorithm to prevent unsecured tokens.
21
+ *
22
+ * @see https://datatracker.ietf.org/doc/html/rfc7519#section-6 Unsecured JWTs
23
+ * @param token - JWT string to verify
24
+ * @param secret - CryptoKey or KeyObject used to verify the JWT
25
+ * @returns verify and return the payload of the JWT
26
+ */
27
+ declare const verifyJWS: (token: string, secret: SecretInput) => Promise<JWTPayload>;
28
+ /**
29
+ * Create a JWS (JSON Web Signature) signer and verifier. It implements the `signJWS`
30
+ * and `verifyJWS` functions of the module.
31
+ *
32
+ * @param secret - Secret key used for signing and verifying the JWS
33
+ * @returns signJWS and verifyJWS functions
34
+ */
35
+ declare const createJWS: (secret: SecretInput) => {
36
+ signJWS: (payload: JWTPayload) => Promise<string>;
37
+ verifyJWS: (payload: string) => Promise<JWTPayload>;
38
+ };
39
+
40
+ interface EncryptedPayload {
41
+ token: string;
42
+ }
43
+ /**
44
+ * Encrypt a standard JWT token with the following claims:
45
+ * - alg: algorithm used to encrypt the JWT
46
+ * - enc: encryption method used
47
+ * - typ: type of the token
48
+ * - cty: content type of the token
49
+ *
50
+ * @param payload - Payload data information to encrypt the JWT
51
+ * @param secret - Secret key to encrypt the JWT (CryptoKey, KeyObject, string or Uint8Array)
52
+ * @returns Encrypted JWT string
53
+ */
54
+ declare const encryptJWE: (payload: string, secret: SecretInput) => Promise<string>;
55
+ /**
56
+ * Decrypt a JWE token and return the payload if valid.
57
+ *
58
+ * @param token - Encrypted JWT string to decrypt
59
+ * @param secret - Secret key to decrypt the JWT (CryptoKey, KeyObject, string or Uint8Array)
60
+ * @returns Decrypted JWT payload string
61
+ */
62
+ declare const decryptJWE: (token: string, secret: SecretInput) => Promise<string>;
63
+ /**
64
+ * Creates a `JWE (JSON Web Encryption)` encrypter and decrypter. It implements the `encryptJWE`
65
+ * and `decryptJWE` functions of the module.
66
+ *
67
+ * @param secret - Secret key used for encrypting and decrypting the JWE
68
+ * @returns encryptJWE and decryptJWE functions
69
+ */
70
+ declare const createJWE: (secret: SecretInput) => {
71
+ encryptJWE: (payload: string) => Promise<string>;
72
+ decryptJWE: (payload: string) => Promise<string>;
73
+ };
74
+
75
+ /**
76
+ * @module @aura-stack/jose
77
+ */
78
+
79
+ type SecretInput = KeyObject | Uint8Array | string;
80
+ /**
81
+ * Encode a JWT signed and encrypted token. The token first signed using JWS
82
+ * and then encrypted using JWE to ensure both integrity and confidentiality.
83
+ * It implements the `signJWS` and `encryptJWE` functions of the module.
84
+ *
85
+ * Based on the RFC 7519 standard
86
+ * - Official RFC: https://datatracker.ietf.org/doc/html/rfc7519
87
+ * - Nested JWTs should be signed and then encrypted: https://datatracker.ietf.org/doc/html/rfc7519#section-5.2
88
+ * - Ensuring the integrity and confidentiality of the claims: https://datatracker.ietf.org/doc/html/rfc7519#section-11.2
89
+ *
90
+ * @param token - Payload data to encode in the JWT
91
+ * @param secret - Secret key used for both signing and encrypting the JWT
92
+ * @returns Promise resolving to the signed and encrypted JWT string
93
+ */
94
+ declare const encodeJWT: (token: JWTPayload, secret: SecretInput) => Promise<string>;
95
+ /**
96
+ * Decode a JWT signed and encrypted token. The token is first decrypted using JWE
97
+ * and then verified using JWS to ensure both confidentiality and integrity. It
98
+ * implements the `decryptJWE` and `verifyJWS` functions of the module.
99
+ *
100
+ * Based on the RFC 7519 standard
101
+ * - Official RFC: https://datatracker.ietf.org/doc/html/rfc7519
102
+ * - Validating a JWT: https://datatracker.ietf.org/doc/html/rfc7519#section-7.2
103
+ * @param token
104
+ * @param secret
105
+ * @returns
106
+ */
107
+ declare const decodeJWT: (token: string, secret: SecretInput) => Promise<JWTPayload>;
108
+ /**
109
+ * Create a JWT handler with encode and decode methods to `signJWS/encryptJWE` and `verifyJWS/decryptJWE`
110
+ * JWT tokens. The JWTs are signed and verified using JWS and encrypted and decrypted using JWE. It
111
+ * implements the `signJWS`, `verifyJWS`, `encryptJWE` and `decryptJWE` functions of the module.
112
+ *
113
+ * @param secret - Secret key used for signing, verifying, encrypting and decrypting the JWT
114
+ * @returns JWT handler object with `signJWS/encryptJWE` and `verifyJWS/decryptJWE` methods
115
+ */
116
+ declare const createJWT: (secret: SecretInput) => {
117
+ encodeJWT: (payload: JWTPayload) => Promise<string>;
118
+ decodeJWT: (token: string) => Promise<JWTPayload>;
119
+ };
120
+
121
+ /**
122
+ * Generate a derived key using HKDF (HMAC-based Extract-and-Expand Key Derivation Function)
123
+ *
124
+ * @param secret Value used as the input keying material
125
+ * @param salt Cryptographic salt
126
+ * @param info Context and application specific information
127
+ * @param length Size of the derived key in bytes (default is 32 bytes)
128
+ * @returns Derived key as Uint8Array and base64 encoded string
129
+ */
130
+ declare const deriveKey: (secret: SecretInput, salt: BinaryLike, info: string, length?: number) => {
131
+ key: ArrayBuffer;
132
+ derivedKey: Buffer<ArrayBuffer>;
133
+ };
134
+ /**
135
+ * Create a derived key from a given secret.
136
+ *
137
+ * @param secret - The secret as a string or Uint8Array
138
+ * @returns The secret in Uint8Array format
139
+ */
140
+ declare const createDeriveKey: (secret: SecretInput, salt?: BinaryLike, info?: string, length?: number) => {
141
+ key: ArrayBuffer;
142
+ derivedKey: Buffer<ArrayBuffer>;
143
+ };
144
+
145
+ export { type EncryptedPayload, type SecretInput, createDeriveKey, createJWE, createJWS, createJWT, decodeJWT, decryptJWE, deriveKey, encodeJWT, encryptJWE, signJWS, verifyJWS };
package/dist/index.js ADDED
@@ -0,0 +1,56 @@
1
+ import {
2
+ createDeriveKey,
3
+ deriveKey
4
+ } from "./chunk-ODRHALUH.js";
5
+ import {
6
+ createJWE,
7
+ decryptJWE,
8
+ encryptJWE
9
+ } from "./chunk-T7MMDRY3.js";
10
+ import {
11
+ createJWS,
12
+ signJWS,
13
+ verifyJWS
14
+ } from "./chunk-KSVD3YEC.js";
15
+ import "./chunk-M4WAOCIJ.js";
16
+
17
+ // src/index.ts
18
+ var encodeJWT = async (token, secret) => {
19
+ try {
20
+ const { signJWS: signJWS2 } = createJWS(secret);
21
+ const { encryptJWE: encryptJWE2 } = createJWE(secret);
22
+ const signed = await signJWS2(token);
23
+ return await encryptJWE2(signed);
24
+ } catch (error) {
25
+ throw new Error("Failed to encode JWT", { cause: error });
26
+ }
27
+ };
28
+ var decodeJWT = async (token, secret) => {
29
+ try {
30
+ const { verifyJWS: verifyJWS2 } = createJWS(secret);
31
+ const { decryptJWE: decryptJWE2 } = createJWE(secret);
32
+ const decrypted = await decryptJWE2(token);
33
+ return await verifyJWS2(decrypted);
34
+ } catch (error) {
35
+ throw new Error("Failed to decode JWT", { cause: error });
36
+ }
37
+ };
38
+ var createJWT = (secret) => {
39
+ return {
40
+ encodeJWT: async (payload) => encodeJWT(payload, secret),
41
+ decodeJWT: async (token) => decodeJWT(token, secret)
42
+ };
43
+ };
44
+ export {
45
+ createDeriveKey,
46
+ createJWE,
47
+ createJWS,
48
+ createJWT,
49
+ decodeJWT,
50
+ decryptJWE,
51
+ deriveKey,
52
+ encodeJWT,
53
+ encryptJWE,
54
+ signJWS,
55
+ verifyJWS
56
+ };
package/dist/jose.cjs ADDED
@@ -0,0 +1,24 @@
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+
17
+ // src/jose.ts
18
+ var jose_exports = {};
19
+ module.exports = __toCommonJS(jose_exports);
20
+ __reExport(jose_exports, require("jose"), module.exports);
21
+ // Annotate the CommonJS export names for ESM import in node:
22
+ 0 && (module.exports = {
23
+ ...require("jose")
24
+ });
package/dist/jose.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from 'jose';
package/dist/jose.js ADDED
@@ -0,0 +1,2 @@
1
+ // src/jose.ts
2
+ export * from "jose";
@@ -0,0 +1,39 @@
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
+
20
+ // src/secret.ts
21
+ var secret_exports = {};
22
+ __export(secret_exports, {
23
+ createSecret: () => createSecret
24
+ });
25
+ module.exports = __toCommonJS(secret_exports);
26
+ var createSecret = (secret) => {
27
+ if (secret === void 0) throw new Error("Secret is required");
28
+ if (typeof secret === "string") {
29
+ if (new TextEncoder().encode(secret).byteLength < 32) {
30
+ throw new Error("Secret string must be at least 32 characters long");
31
+ }
32
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
33
+ }
34
+ return secret;
35
+ };
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ createSecret
39
+ });
@@ -0,0 +1,14 @@
1
+ import * as crypto from 'crypto';
2
+ import { SecretInput } from './index.js';
3
+ import 'node:crypto';
4
+ import 'jose';
5
+
6
+ /**
7
+ * Create a secret in Uint8Array format
8
+ *
9
+ * @param secret - The secret as a string or Uint8Array
10
+ * @returns The secret in Uint8Array format
11
+ */
12
+ declare const createSecret: (secret: SecretInput) => crypto.KeyObject | Uint8Array<ArrayBufferLike>;
13
+
14
+ export { createSecret };
package/dist/secret.js ADDED
@@ -0,0 +1,6 @@
1
+ import {
2
+ createSecret
3
+ } from "./chunk-M4WAOCIJ.js";
4
+ export {
5
+ createSecret
6
+ };
package/dist/sign.cjs ADDED
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/sign.ts
31
+ var sign_exports = {};
32
+ __export(sign_exports, {
33
+ createJWS: () => createJWS,
34
+ signJWS: () => signJWS,
35
+ verifyJWS: () => verifyJWS
36
+ });
37
+ module.exports = __toCommonJS(sign_exports);
38
+ var import_node_crypto = __toESM(require("crypto"), 1);
39
+ var import_jose = require("jose");
40
+
41
+ // src/secret.ts
42
+ var createSecret = (secret) => {
43
+ if (secret === void 0) throw new Error("Secret is required");
44
+ if (typeof secret === "string") {
45
+ if (new TextEncoder().encode(secret).byteLength < 32) {
46
+ throw new Error("Secret string must be at least 32 characters long");
47
+ }
48
+ return new Uint8Array(Buffer.from(secret, "utf-8"));
49
+ }
50
+ return secret;
51
+ };
52
+
53
+ // src/sign.ts
54
+ var signJWS = async (payload, secret) => {
55
+ const secretKey = createSecret(secret);
56
+ const jti = import_node_crypto.default.randomBytes(32).toString("base64");
57
+ return new import_jose.SignJWT(payload).setProtectedHeader({ alg: "HS256", typ: "JWT" }).setIssuedAt().setNotBefore("0s").setExpirationTime("15d").setJti(jti).sign(secretKey);
58
+ };
59
+ var verifyJWS = async (token, secret) => {
60
+ try {
61
+ const secretKey = createSecret(secret);
62
+ const { payload } = await (0, import_jose.jwtVerify)(token, secretKey);
63
+ return payload;
64
+ } catch (error) {
65
+ throw new Error("Invalid JWS", { cause: error });
66
+ }
67
+ };
68
+ var createJWS = (secret) => {
69
+ return {
70
+ signJWS: (payload) => signJWS(payload, secret),
71
+ verifyJWS: (payload) => verifyJWS(payload, secret)
72
+ };
73
+ };
74
+ // Annotate the CommonJS export names for ESM import in node:
75
+ 0 && (module.exports = {
76
+ createJWS,
77
+ signJWS,
78
+ verifyJWS
79
+ });
package/dist/sign.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import 'jose';
2
+ export { createJWS, signJWS, verifyJWS } from './index.js';
3
+ import 'node:crypto';
package/dist/sign.js ADDED
@@ -0,0 +1,11 @@
1
+ import {
2
+ createJWS,
3
+ signJWS,
4
+ verifyJWS
5
+ } from "./chunk-KSVD3YEC.js";
6
+ import "./chunk-M4WAOCIJ.js";
7
+ export {
8
+ createJWS,
9
+ signJWS,
10
+ verifyJWS
11
+ };
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@aura-stack/jose",
3
+ "version": "0.1.0-rc.1",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "JOSE utilities for @aura-stack/auth",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/aura-stack-ts/auth"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "require": "./dist/index.cjs",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./encrypt": {
21
+ "types": "./dist/encrypt.d.ts",
22
+ "require": "./dist/encrypt.cjs",
23
+ "import": "./dist/encrypt.js"
24
+ },
25
+ "./sign": {
26
+ "types": "./dist/sign.d.ts",
27
+ "require": "./dist/sign.cjs",
28
+ "import": "./dist/sign.js"
29
+ },
30
+ "./jose": {
31
+ "types": "./dist/jose.d.ts",
32
+ "require": "./dist/jose.cjs",
33
+ "import": "./dist/jose.js"
34
+ },
35
+ "./hkdf": {
36
+ "types": "./dist/deriveKey.d.ts",
37
+ "require": "./dist/deriveKey.cjs",
38
+ "import": "./dist/deriveKey.js"
39
+ }
40
+ },
41
+ "keywords": [
42
+ "auth",
43
+ "session",
44
+ "authentication"
45
+ ],
46
+ "author": "Aura Stack <aurastackjs@gmail.com> | Hernan Alvarado <halvaradop.dev@gmail.com>",
47
+ "homepage": "https://aura-stack-auth.vercel.app",
48
+ "bugs": {
49
+ "url": "https://github.com/aura-stack-ts/auth/issues"
50
+ },
51
+ "license": "MIT",
52
+ "dependencies": {
53
+ "jose": "^6.1.2"
54
+ },
55
+ "devDependencies": {
56
+ "@aura-stack/tsconfig": "0.0.0",
57
+ "@aura-stack/tsup-config": "0.0.0"
58
+ },
59
+ "scripts": {
60
+ "dev": "tsup --watch",
61
+ "build": "tsup",
62
+ "test": "vitest --run",
63
+ "test:watch": "vitest",
64
+ "test:coverage": "vitest --run --coverage",
65
+ "format": "prettier --write . --cache --cache-location .cache/.prettiercache",
66
+ "format:check": "prettier --check . --cache --cache-location .cache/.prettiercache",
67
+ "type-check": "tsc --noEmit",
68
+ "clean": "rm -rf dist",
69
+ "clean:cts": "rm -rf dist/*.cts",
70
+ "prepublish": "pnpm clean:cts"
71
+ }
72
+ }