jose 4.10.4 → 4.11.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # jose
2
2
 
3
- > "JSON Web Almost Everything" - JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, and other Web-interoperable runtimes.
3
+ > "JSON Web Almost Everything" - JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes.
4
4
 
5
5
  ## Implemented specs & features
6
6
 
@@ -38,7 +38,7 @@ const jose = require('jose')
38
38
 
39
39
  **`example`** Deno import
40
40
  ```js
41
- import * as jose from 'https://deno.land/x/jose/index.ts'
41
+ import * as jose from 'https://deno.land/x/jose@v4.11.1/index.ts'
42
42
  ```
43
43
 
44
44
  - JSON Web Tokens (JWT)
@@ -83,11 +83,11 @@ import * as jose from 'https://deno.land/x/jose/index.ts'
83
83
  The supported JavaScript runtimes include ones that support the utilized Web API globals and standard built-in objects or are Node.js
84
84
 
85
85
  These are _(this is not an exhaustive list)_:
86
+ - [Bun](https://github.com/panva/jose/issues/471)
86
87
  - [Browsers](https://github.com/panva/jose/issues/263)
87
88
  - [Cloudflare Workers](https://github.com/panva/jose/issues/265)
88
89
  - [Deno](https://github.com/panva/jose/issues/266)
89
90
  - [Electron](https://github.com/panva/jose/issues/264)
90
- - [Netlify Edge](https://github.com/panva/jose/issues/266)
91
91
  - [Node.js](https://github.com/panva/jose/issues/262)
92
92
  - [Vercel's Edge Runtime](https://github.com/panva/jose/issues/301)
93
93
 
@@ -94,11 +94,12 @@ export async function importX509(x509, alg, options) {
94
94
  }
95
95
  export async function importPKCS8(pkcs8, alg, options) {
96
96
  if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {
97
- throw new TypeError('"pkcs8" must be PKCS8 formatted string');
97
+ throw new TypeError('"pkcs8" must be PKCS#8 formatted string');
98
98
  }
99
99
  return importPrivate(pkcs8, alg, options);
100
100
  }
101
101
  export async function importJWK(jwk, alg, octAsKeyObject) {
102
+ var _a;
102
103
  if (!isObject(jwk)) {
103
104
  throw new TypeError('JWK must be an object');
104
105
  }
@@ -113,7 +114,7 @@ export async function importJWK(jwk, alg, octAsKeyObject) {
113
114
  }
114
115
  octAsKeyObject !== null && octAsKeyObject !== void 0 ? octAsKeyObject : (octAsKeyObject = jwk.ext !== true);
115
116
  if (octAsKeyObject) {
116
- return asKeyObject({ ...jwk, alg, ext: false });
117
+ return asKeyObject({ ...jwk, alg, ext: (_a = jwk.ext) !== null && _a !== void 0 ? _a : false });
117
118
  }
118
119
  return decodeBase64URL(jwk.k);
119
120
  case 'RSA':
@@ -99,12 +99,13 @@ async function importX509(x509, alg, options) {
99
99
  exports.importX509 = importX509;
100
100
  async function importPKCS8(pkcs8, alg, options) {
101
101
  if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {
102
- throw new TypeError('"pkcs8" must be PKCS8 formatted string');
102
+ throw new TypeError('"pkcs8" must be PKCS#8 formatted string');
103
103
  }
104
104
  return (0, asn1_js_2.fromPKCS8)(pkcs8, alg, options);
105
105
  }
106
106
  exports.importPKCS8 = importPKCS8;
107
107
  async function importJWK(jwk, alg, octAsKeyObject) {
108
+ var _a;
108
109
  if (!(0, is_object_js_1.default)(jwk)) {
109
110
  throw new TypeError('JWK must be an object');
110
111
  }
@@ -119,7 +120,7 @@ async function importJWK(jwk, alg, octAsKeyObject) {
119
120
  }
120
121
  octAsKeyObject !== null && octAsKeyObject !== void 0 ? octAsKeyObject : (octAsKeyObject = jwk.ext !== true);
121
122
  if (octAsKeyObject) {
122
- return (0, jwk_to_key_js_1.default)({ ...jwk, alg, ext: false });
123
+ return (0, jwk_to_key_js_1.default)({ ...jwk, alg, ext: (_a = jwk.ext) !== null && _a !== void 0 ? _a : false });
123
124
  }
124
125
  return (0, base64url_js_1.decode)(jwk.k);
125
126
  case 'RSA':
@@ -94,11 +94,12 @@ export async function importX509(x509, alg, options) {
94
94
  }
95
95
  export async function importPKCS8(pkcs8, alg, options) {
96
96
  if (typeof pkcs8 !== 'string' || pkcs8.indexOf('-----BEGIN PRIVATE KEY-----') !== 0) {
97
- throw new TypeError('"pkcs8" must be PKCS8 formatted string');
97
+ throw new TypeError('"pkcs8" must be PKCS#8 formatted string');
98
98
  }
99
99
  return importPrivate(pkcs8, alg, options);
100
100
  }
101
101
  export async function importJWK(jwk, alg, octAsKeyObject) {
102
+ var _a;
102
103
  if (!isObject(jwk)) {
103
104
  throw new TypeError('JWK must be an object');
104
105
  }
@@ -113,7 +114,7 @@ export async function importJWK(jwk, alg, octAsKeyObject) {
113
114
  }
114
115
  octAsKeyObject !== null && octAsKeyObject !== void 0 ? octAsKeyObject : (octAsKeyObject = jwk.ext !== true);
115
116
  if (octAsKeyObject) {
116
- return asKeyObject({ ...jwk, alg, ext: false });
117
+ return asKeyObject({ ...jwk, alg, ext: (_a = jwk.ext) !== null && _a !== void 0 ? _a : false });
117
118
  }
118
119
  return decodeBase64URL(jwk.k);
119
120
  case 'RSA':
@@ -15,10 +15,11 @@ export interface JWTDecryptGetKey extends GetKeyFunction<CompactJWEHeaderParamet
15
15
  * @example Usage
16
16
  *
17
17
  * ```js
18
+ * const secret = jose.base64url.decode('zH4NRP1HMALxxCFnRZABFA7GOJtzU_gIj02alfL1lvI')
18
19
  * const jwt =
19
- * 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..KVcNLqK-3-8ZkYIC.xSwF4VxO0kUMUD2W-cifsNUxnr-swyBq-nADBptyt6y9n79-iNc5b0AALJpRwc0wwDkJw8hNOMjApNUTMsK9b-asToZ3DXFMvwfJ6n1aWefvd7RsoZ2LInWFfVAuttJDzoGB.uuexQoWHwrLMEYRElT8pBQ'
20
+ * 'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..MB66qstZBPxAXKdsjet_lA.WHbtJTl4taHp7otOHLq3hBvv0yNPsPEKHYInmCPdDDeyV1kU-f-tGEiU4FxlSqkqAT2hVs8_wMNiQFAzPU1PUgIqWCPsBrPP3TtxYsrtwagpn4SvCsUsx0Mhw9ZhliAO8CLmCBQkqr_T9AcYsz5uZw.7nX9m7BGUu_u1p1qFHzyIg'
20
21
  *
21
- * const { payload, protectedHeader } = await jose.jwtDecrypt(jwt, secretKey, {
22
+ * const { payload, protectedHeader } = await jose.jwtDecrypt(jwt, secret, {
22
23
  * issuer: 'urn:example:issuer',
23
24
  * audience: 'urn:example:audience',
24
25
  * })
@@ -6,13 +6,14 @@ import { ProduceJWT } from './produce';
6
6
  * @example Usage
7
7
  *
8
8
  * ```js
9
+ * const secret = jose.base64url.decode('zH4NRP1HMALxxCFnRZABFA7GOJtzU_gIj02alfL1lvI')
9
10
  * const jwt = await new jose.EncryptJWT({ 'urn:example:claim': true })
10
- * .setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
11
+ * .setProtectedHeader({ alg: 'dir', enc: 'A128CBC-HS256' })
11
12
  * .setIssuedAt()
12
13
  * .setIssuer('urn:example:issuer')
13
14
  * .setAudience('urn:example:audience')
14
15
  * .setExpirationTime('2h')
15
- * .encrypt(secretKey)
16
+ * .encrypt(secret)
16
17
  *
17
18
  * console.log(jwt)
18
19
  * ```
@@ -3,11 +3,89 @@ import { ProduceJWT } from './produce';
3
3
  /**
4
4
  * The SignJWT class is a utility for creating Compact JWS formatted JWT strings.
5
5
  *
6
- * @example Usage
6
+ * @example Usage with a symmetric secret
7
7
  *
8
8
  * ```js
9
+ * const secret = new TextEncoder().encode(
10
+ * 'cc7e0d44fd473002f1c42167459001140ec6389b7353f8088f4d9a95f2f596f2',
11
+ * )
12
+ * const alg = 'HS256'
13
+ *
14
+ * const jwt = await new jose.SignJWT({ 'urn:example:claim': true })
15
+ * .setProtectedHeader({ alg })
16
+ * .setIssuedAt()
17
+ * .setIssuer('urn:example:issuer')
18
+ * .setAudience('urn:example:audience')
19
+ * .setExpirationTime('2h')
20
+ * .sign(secret)
21
+ *
22
+ * console.log(jwt)
23
+ * ```
24
+ *
25
+ * @example Usage with a private PKCS#8 encoded RSA key
26
+ *
27
+ * ```js
28
+ * const alg = 'RS256'
29
+ * const pkcs8 = `-----BEGIN PRIVATE KEY-----
30
+ * MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCFg4UrY5xtulv
31
+ * /NXKmL1J4qI1SopAfTNMo3X7p+kJO7plqUYjzaztcre1qfh0m33Sm1Q8oPbO/GpP
32
+ * MU1/HgcceytgJ/b4UwufVVMl9BrMDYG8moDBylbVupFQS3Ly1L9i/iFG9Z9A9xzY
33
+ * Zzf799A45bnvNXL6s2glzvjiRvfQ2NDF0anTcnZLcYtC7ugq1IMM+ihAcPfw8Qw2
34
+ * chN/SmP4qAM+PKaQwagmU7doqmmyN9u38AfoYZ1GCFhEs5TBBT6H6h9YdHeVtiIq
35
+ * 1c+fl03biSIfLrV7dUBD39gBmXBcL/30Ya3D82mCEUC4zg/UkOfQOmkmV3Lc8YUL
36
+ * QZ8EJkBLAgMBAAECggEAVuVE/KEP6323WjpbBdAIv7HGahGrgGANvbxZsIhm34ls
37
+ * VOPK0XDegZkhAybMZHjRhp+gwVxX5ChC+J3cUpOBH5FNxElgW6HizD2Jcq6t6LoL
38
+ * YgPSrfEHm71iHg8JsgrqfUnGYFzMJmv88C6WdCtpgG/qJV1K00/Ly1G1QKoBffEs
39
+ * +v4fAMJrCbUdCz1qWto+PU+HLMEo+krfEpGgcmtZeRlDADh8cETMQlgQfQX2VWq/
40
+ * aAP4a1SXmo+j0cvRU4W5Fj0RVwNesIpetX2ZFz4p/JmB5sWFEj/fC7h5z2lq+6Bm
41
+ * e2T3BHtXkIxoBW0/pYVnASC8P2puO5FnVxDmWuHDYQKBgQDTuuBd3+0tSFVEX+DU
42
+ * 5qpFmHm5nyGItZRJTS+71yg5pBxq1KqNCUjAtbxR0q//fwauakh+BwRVCPOrqsUG
43
+ * jBSb3NYE70Srp6elqxgkE54PwQx4Mr6exJPnseM9U4K+hULllf5yjM9edreJE1nV
44
+ * NVgFjeyafQhrHKwgr7PERJ/ikwKBgQDqqsT1M+EJLmI1HtCspOG6cu7q3gf/wKRh
45
+ * E8tu84i3YyBnI8uJkKy92RNVI5fvpBARe3tjSdM25rr2rcrcmF/5g6Q9ImxZPGCt
46
+ * 86eOgO9ErNtbc4TEgybsP319UE4O41aKeNiBTAZKoYCxv/dMqG0j4avmWzd+foHq
47
+ * gSNUvR2maQKBgQCYeqOsV2B6VPY7KIVFLd0AA9/dwvEmgAYLiA/RShDI+hwQ/5jX
48
+ * uxDu37KAhqeC65sHLrmIMUt4Zdr+DRyZK3aIDNEAesPMjw/X6lCXYp1ZISD2yyym
49
+ * MFGH8X8CIkstI9Faf9vf6PJKSFrC1/HA7wq17VCwrUzLvrljTMW8meM/CwKBgCpo
50
+ * 2leGHLFQFKeM/iF1WuYbR1pi7gcmhY6VyTowARFDdOOu8GXYI5/bz0afvCGvAMho
51
+ * DJCREv7lC/zww6zCTPYG+HOj+PjXlJFba3ixjIxYwPvyEJiDK1Ge18sB7Fl8dHNq
52
+ * C5ayaqCqN1voWYUdGzxU2IA1E/5kVo5O8FesJeOhAoGBAImJbZFf+D5kA32Xxhac
53
+ * 59lLWBCsocvvbd1cvDMNlRywAAyhsCb1SuX4nEAK9mrSBdfmoF2Nm3eilfsOds0f
54
+ * K5mX069IKG82CMqh3Mzptd7e7lyb9lsoGO0BAtjho3cWtha/UZ70vfaMzGuZ6JmQ
55
+ * ak6k+8+UFd93M4z0Qo74OhXB
56
+ * -----END PRIVATE KEY----`
57
+ * const privateKey = await jose.importPKCS8(pkcs8, alg)
58
+ *
59
+ * const jwt = await new jose.SignJWT({ 'urn:example:claim': true })
60
+ * .setProtectedHeader({ alg })
61
+ * .setIssuedAt()
62
+ * .setIssuer('urn:example:issuer')
63
+ * .setAudience('urn:example:audience')
64
+ * .setExpirationTime('2h')
65
+ * .sign(privateKey)
66
+ *
67
+ * console.log(jwt)
68
+ * ```
69
+ *
70
+ * @example Usage with a private JWK encoded RSA key
71
+ *
72
+ * ```js
73
+ * const alg = 'RS256'
74
+ * const jwk = {
75
+ * kty: 'RSA',
76
+ * n: 'whYOFK2Ocbbpb_zVypi9SeKiNUqKQH0zTKN1-6fpCTu6ZalGI82s7XK3tan4dJt90ptUPKD2zvxqTzFNfx4HHHsrYCf2-FMLn1VTJfQazA2BvJqAwcpW1bqRUEty8tS_Yv4hRvWfQPcc2Gc3-_fQOOW57zVy-rNoJc744kb30NjQxdGp03J2S3GLQu7oKtSDDPooQHD38PEMNnITf0pj-KgDPjymkMGoJlO3aKppsjfbt_AH6GGdRghYRLOUwQU-h-ofWHR3lbYiKtXPn5dN24kiHy61e3VAQ9_YAZlwXC_99GGtw_NpghFAuM4P1JDn0DppJldy3PGFC0GfBCZASw',
77
+ * e: 'AQAB',
78
+ * d: 'VuVE_KEP6323WjpbBdAIv7HGahGrgGANvbxZsIhm34lsVOPK0XDegZkhAybMZHjRhp-gwVxX5ChC-J3cUpOBH5FNxElgW6HizD2Jcq6t6LoLYgPSrfEHm71iHg8JsgrqfUnGYFzMJmv88C6WdCtpgG_qJV1K00_Ly1G1QKoBffEs-v4fAMJrCbUdCz1qWto-PU-HLMEo-krfEpGgcmtZeRlDADh8cETMQlgQfQX2VWq_aAP4a1SXmo-j0cvRU4W5Fj0RVwNesIpetX2ZFz4p_JmB5sWFEj_fC7h5z2lq-6Bme2T3BHtXkIxoBW0_pYVnASC8P2puO5FnVxDmWuHDYQ',
79
+ * p: '07rgXd_tLUhVRF_g1OaqRZh5uZ8hiLWUSU0vu9coOaQcatSqjQlIwLW8UdKv_38GrmpIfgcEVQjzq6rFBowUm9zWBO9Eq6enpasYJBOeD8EMeDK-nsST57HjPVOCvoVC5ZX-cozPXna3iRNZ1TVYBY3smn0IaxysIK-zxESf4pM',
80
+ * q: '6qrE9TPhCS5iNR7QrKThunLu6t4H_8CkYRPLbvOIt2MgZyPLiZCsvdkTVSOX76QQEXt7Y0nTNua69q3K3Jhf-YOkPSJsWTxgrfOnjoDvRKzbW3OExIMm7D99fVBODuNWinjYgUwGSqGAsb_3TKhtI-Gr5ls3fn6B6oEjVL0dpmk',
81
+ * dp: 'mHqjrFdgelT2OyiFRS3dAAPf3cLxJoAGC4gP0UoQyPocEP-Y17sQ7t-ygIanguubBy65iDFLeGXa_g0cmSt2iAzRAHrDzI8P1-pQl2KdWSEg9ssspjBRh_F_AiJLLSPRWn_b3-jySkhawtfxwO8Kte1QsK1My765Y0zFvJnjPws',
82
+ * dq: 'KmjaV4YcsVAUp4z-IXVa5htHWmLuByaFjpXJOjABEUN0467wZdgjn9vPRp-8Ia8AyGgMkJES_uUL_PDDrMJM9gb4c6P4-NeUkVtreLGMjFjA-_IQmIMrUZ7XywHsWXx0c2oLlrJqoKo3W-hZhR0bPFTYgDUT_mRWjk7wV6wl46E',
83
+ * qi: 'iYltkV_4PmQDfZfGFpzn2UtYEKyhy-9t3Vy8Mw2VHLAADKGwJvVK5ficQAr2atIF1-agXY2bd6KV-w52zR8rmZfTr0gobzYIyqHczOm13t7uXJv2WygY7QEC2OGjdxa2Fr9RnvS99ozMa5nomZBqTqT7z5QV33czjPRCjvg6FcE',
84
+ * }
85
+ * const privateKey = await jose.importJWK(jwk, alg)
86
+ *
9
87
  * const jwt = await new jose.SignJWT({ 'urn:example:claim': true })
10
- * .setProtectedHeader({ alg: 'ES256' })
88
+ * .setProtectedHeader({ alg })
11
89
  * .setIssuedAt()
12
90
  * .setIssuer('urn:example:issuer')
13
91
  * .setAudience('urn:example:audience')
@@ -16,11 +16,62 @@ export interface JWTVerifyGetKey extends GetKeyFunction<JWTHeaderParameters, Fla
16
16
  * Verifies the JWT format (to be a JWS Compact format), verifies the JWS signature, validates the
17
17
  * JWT Claims Set.
18
18
  *
19
- * @example Usage
19
+ * @example Usage with a symmetric secret
20
20
  *
21
21
  * ```js
22
+ * const secret = new TextEncoder().encode(
23
+ * 'cc7e0d44fd473002f1c42167459001140ec6389b7353f8088f4d9a95f2f596f2',
24
+ * )
22
25
  * const jwt =
23
- * 'eyJhbGciOiJFUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjA0MzE1MDc0LCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.hx1nOfAT5LlXuzu8O-bhjXBGpklWDt2EsHw7-MDn49NrnwvVsstNhEnkW2ddauB7eSikFtUNeumLpFI9CWDBsg'
26
+ * 'eyJhbGciOiJIUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjY5MDU2MjMxLCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.C4iSlLfAUMBq--wnC6VqD9gEOhwpRZpoRarE0m7KEnI'
27
+ *
28
+ * const { payload, protectedHeader } = await jose.jwtVerify(jwt, secret, {
29
+ * issuer: 'urn:example:issuer',
30
+ * audience: 'urn:example:audience',
31
+ * })
32
+ *
33
+ * console.log(protectedHeader)
34
+ * console.log(payload)
35
+ * ```
36
+ *
37
+ * @example Usage with a public SPKI encoded RSA key
38
+ *
39
+ * ```js
40
+ * const alg = 'RS256'
41
+ * const spki = `-----BEGIN PUBLIC KEY-----
42
+ * MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwhYOFK2Ocbbpb/zVypi9
43
+ * SeKiNUqKQH0zTKN1+6fpCTu6ZalGI82s7XK3tan4dJt90ptUPKD2zvxqTzFNfx4H
44
+ * HHsrYCf2+FMLn1VTJfQazA2BvJqAwcpW1bqRUEty8tS/Yv4hRvWfQPcc2Gc3+/fQ
45
+ * OOW57zVy+rNoJc744kb30NjQxdGp03J2S3GLQu7oKtSDDPooQHD38PEMNnITf0pj
46
+ * +KgDPjymkMGoJlO3aKppsjfbt/AH6GGdRghYRLOUwQU+h+ofWHR3lbYiKtXPn5dN
47
+ * 24kiHy61e3VAQ9/YAZlwXC/99GGtw/NpghFAuM4P1JDn0DppJldy3PGFC0GfBCZA
48
+ * SwIDAQAB
49
+ * -----END PUBLIC KEY-----`
50
+ * const publicKey = await jose.importSPKI(spki, alg)
51
+ * const jwt =
52
+ * 'eyJhbGciOiJSUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjY5MDU2NDg4LCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.gXrPZ3yM_60dMXGE69dusbpzYASNA-XIOwsb5D5xYnSxyj6_D6OR_uR_1vqhUm4AxZxcrH1_-XJAve9HCw8az_QzHcN-nETt-v6stCsYrn6Bv1YOc-mSJRZ8ll57KVqLbCIbjKwerNX5r2_Qg2TwmJzQdRs-AQDhy-s_DlJd8ql6wR4n-kDZpar-pwIvz4fFIN0Fj57SXpAbLrV6Eo4Byzl0xFD8qEYEpBwjrMMfxCZXTlAVhAq6KCoGlDTwWuExps342-0UErEtyIqDnDGcrfNWiUsoo8j-29IpKd-w9-C388u-ChCxoHz--H8WmMSZzx3zTXsZ5lXLZ9IKfanDKg'
53
+ *
54
+ * const { payload, protectedHeader } = await jose.jwtVerify(jwt, publicKey, {
55
+ * issuer: 'urn:example:issuer',
56
+ * audience: 'urn:example:audience',
57
+ * })
58
+ *
59
+ * console.log(protectedHeader)
60
+ * console.log(payload)
61
+ * ```
62
+ *
63
+ * @example Usage with a public JWK encoded RSA key
64
+ *
65
+ * ```js
66
+ * const alg = 'RS256'
67
+ * const jwk = {
68
+ * kty: 'RSA',
69
+ * n: 'whYOFK2Ocbbpb_zVypi9SeKiNUqKQH0zTKN1-6fpCTu6ZalGI82s7XK3tan4dJt90ptUPKD2zvxqTzFNfx4HHHsrYCf2-FMLn1VTJfQazA2BvJqAwcpW1bqRUEty8tS_Yv4hRvWfQPcc2Gc3-_fQOOW57zVy-rNoJc744kb30NjQxdGp03J2S3GLQu7oKtSDDPooQHD38PEMNnITf0pj-KgDPjymkMGoJlO3aKppsjfbt_AH6GGdRghYRLOUwQU-h-ofWHR3lbYiKtXPn5dN24kiHy61e3VAQ9_YAZlwXC_99GGtw_NpghFAuM4P1JDn0DppJldy3PGFC0GfBCZASw',
70
+ * e: 'AQAB',
71
+ * }
72
+ * const publicKey = await jose.importJWK(jwk, alg)
73
+ * const jwt =
74
+ * 'eyJhbGciOiJSUzI1NiJ9.eyJ1cm46ZXhhbXBsZTpjbGFpbSI6dHJ1ZSwiaWF0IjoxNjY5MDU2NDg4LCJpc3MiOiJ1cm46ZXhhbXBsZTppc3N1ZXIiLCJhdWQiOiJ1cm46ZXhhbXBsZTphdWRpZW5jZSJ9.gXrPZ3yM_60dMXGE69dusbpzYASNA-XIOwsb5D5xYnSxyj6_D6OR_uR_1vqhUm4AxZxcrH1_-XJAve9HCw8az_QzHcN-nETt-v6stCsYrn6Bv1YOc-mSJRZ8ll57KVqLbCIbjKwerNX5r2_Qg2TwmJzQdRs-AQDhy-s_DlJd8ql6wR4n-kDZpar-pwIvz4fFIN0Fj57SXpAbLrV6Eo4Byzl0xFD8qEYEpBwjrMMfxCZXTlAVhAq6KCoGlDTwWuExps342-0UErEtyIqDnDGcrfNWiUsoo8j-29IpKd-w9-C388u-ChCxoHz--H8WmMSZzx3zTXsZ5lXLZ9IKfanDKg'
24
75
  *
25
76
  * const { payload, protectedHeader } = await jose.jwtVerify(jwt, publicKey, {
26
77
  * issuer: 'urn:example:issuer',
@@ -37,6 +88,19 @@ export interface JWTVerifyGetKey extends GetKeyFunction<JWTHeaderParameters, Fla
37
88
  */
38
89
  export declare function jwtVerify(jwt: string | Uint8Array, key: KeyLike | Uint8Array, options?: JWTVerifyOptions): Promise<JWTVerifyResult>;
39
90
  /**
91
+ * @example Usage with a public JSON Web Key Set hosted on a remote URL
92
+ *
93
+ * ```js
94
+ * const JWKS = jose.createRemoteJWKSet(new URL('https://www.googleapis.com/oauth2/v3/certs'))
95
+ *
96
+ * const { payload, protectedHeader } = await jose.jwtVerify(jwt, JWKS, {
97
+ * issuer: 'urn:example:issuer',
98
+ * audience: 'urn:example:audience',
99
+ * })
100
+ * console.log(protectedHeader)
101
+ * console.log(payload)
102
+ * ```
103
+ *
40
104
  * @param jwt JSON Web Token value (encoded as JWS).
41
105
  * @param getKey Function resolving a key to verify the JWT with.
42
106
  * @param options JWT Decryption and JWT Claims Set validation options.
@@ -55,9 +55,9 @@ export declare function importSPKI(spki: string, alg: string, options?: PEMImpor
55
55
  */
56
56
  export declare function importX509(x509: string, alg: string, options?: PEMImportOptions): Promise<KeyLike>;
57
57
  /**
58
- * Imports a PEM-encoded PKCS8 string as a runtime-specific private key representation (KeyObject or
59
- * CryptoKey). See [Algorithm Key Requirements](https://github.com/panva/jose/issues/210) to learn
60
- * about key to algorithm requirements and mapping. Encrypted keys are not supported.
58
+ * Imports a PEM-encoded PKCS#8 string as a runtime-specific private key representation (KeyObject
59
+ * or CryptoKey). See [Algorithm Key Requirements](https://github.com/panva/jose/issues/210) to
60
+ * learn about key to algorithm requirements and mapping. Encrypted keys are not supported.
61
61
  *
62
62
  * @example Usage
63
63
  *
@@ -71,7 +71,7 @@ export declare function importX509(x509: string, alg: string, options?: PEMImpor
71
71
  * const ecPrivateKey = await jose.importPKCS8(pkcs8, algorithm)
72
72
  * ```
73
73
  *
74
- * @param pem PEM-encoded PKCS8 string
74
+ * @param pem PEM-encoded PKCS#8 string
75
75
  * @param alg JSON Web Algorithm identifier to be used with the imported key.
76
76
  */
77
77
  export declare function importPKCS8(pkcs8: string, alg: string, options?: PEMImportOptions): Promise<KeyLike>;
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "jose",
3
- "version": "4.10.4",
4
- "description": "'JSON Web Almost Everything' - JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, and other Web-interoperable runtimes",
3
+ "version": "4.11.1",
4
+ "description": "'JSON Web Almost Everything' - JWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes",
5
5
  "keywords": [
6
6
  "browser",
7
+ "bun",
7
8
  "cloudflare",
8
9
  "compact",
9
10
  "decode",
@@ -61,6 +62,7 @@
61
62
  "exports": {
62
63
  ".": {
63
64
  "types": "./dist/types/index.d.ts",
65
+ "bun": "./dist/browser/index.js",
64
66
  "deno": "./dist/browser/index.js",
65
67
  "browser": "./dist/browser/index.js",
66
68
  "worker": "./dist/browser/index.js",