@pagopa/io-react-native-jwt 0.4.1 → 0.6.0
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 +14 -0
- package/android/src/main/java/com/pagopa/ioreactnativejwt/IoReactNativeJwtModule.kt +35 -15
- package/ios/IoReactNativeJwt.mm +6 -0
- package/ios/IoReactNativeJwt.swift +63 -0
- package/lib/commonjs/index.js +42 -125
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/jwe/index.js +41 -0
- package/lib/commonjs/jwe/index.js.map +1 -0
- package/lib/commonjs/jwk/index.js +54 -0
- package/lib/commonjs/jwk/index.js.map +1 -0
- package/lib/commonjs/jwt/index.js +217 -0
- package/lib/commonjs/jwt/index.js.map +1 -0
- package/lib/commonjs/{jwt_claims_set.js → jwt/jwt_claims_set.js} +2 -2
- package/lib/commonjs/jwt/jwt_claims_set.js.map +1 -0
- package/lib/commonjs/{produce.js → jwt/produce.js} +2 -2
- package/lib/commonjs/jwt/produce.js.map +1 -0
- package/lib/commonjs/{sign.js → jwt/sign.js} +4 -4
- package/lib/commonjs/jwt/sign.js.map +1 -0
- package/lib/commonjs/{unsecured.js → jwt/unsecured.js} +2 -2
- package/lib/commonjs/jwt/unsecured.js.map +1 -0
- package/lib/commonjs/types.js +63 -0
- package/lib/commonjs/types.js.map +1 -1
- package/lib/commonjs/utils/errors.js +50 -1
- package/lib/commonjs/utils/errors.js.map +1 -1
- package/lib/module/index.js +6 -111
- package/lib/module/index.js.map +1 -1
- package/lib/module/jwe/index.js +35 -0
- package/lib/module/jwe/index.js.map +1 -0
- package/lib/module/jwk/index.js +47 -0
- package/lib/module/jwk/index.js.map +1 -0
- package/lib/module/jwt/index.js +138 -0
- package/lib/module/jwt/index.js.map +1 -0
- package/lib/module/{jwt_claims_set.js → jwt/jwt_claims_set.js} +2 -2
- package/lib/module/jwt/jwt_claims_set.js.map +1 -0
- package/lib/module/{produce.js → jwt/produce.js} +2 -2
- package/lib/module/jwt/produce.js.map +1 -0
- package/lib/module/{sign.js → jwt/sign.js} +4 -4
- package/lib/module/jwt/sign.js.map +1 -0
- package/lib/module/{unsecured.js → jwt/unsecured.js} +2 -2
- package/lib/module/jwt/unsecured.js.map +1 -0
- package/lib/module/types.js +56 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/errors.js +46 -0
- package/lib/module/utils/errors.js.map +1 -1
- package/lib/typescript/index.d.ts +6 -89
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/jwe/index.d.ts +32 -0
- package/lib/typescript/jwe/index.d.ts.map +1 -0
- package/lib/typescript/jwk/index.d.ts +30 -0
- package/lib/typescript/jwk/index.d.ts.map +1 -0
- package/lib/typescript/jwt/index.d.ts +102 -0
- package/lib/typescript/jwt/index.d.ts.map +1 -0
- package/lib/typescript/{jwt_claims_set.d.ts → jwt/jwt_claims_set.d.ts} +1 -1
- package/lib/typescript/jwt/jwt_claims_set.d.ts.map +1 -0
- package/lib/typescript/{produce.d.ts → jwt/produce.d.ts} +1 -1
- package/lib/typescript/jwt/produce.d.ts.map +1 -0
- package/lib/typescript/{sign.d.ts → jwt/sign.d.ts} +1 -1
- package/lib/typescript/jwt/sign.d.ts.map +1 -0
- package/lib/typescript/{unsecured.d.ts → jwt/unsecured.d.ts} +1 -1
- package/lib/typescript/jwt/unsecured.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +348 -46
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/utils/errors.d.ts +37 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/index.tsx +6 -116
- package/src/jwe/index.ts +45 -0
- package/src/jwk/index.ts +51 -0
- package/src/jwt/index.ts +148 -0
- package/src/{jwt_claims_set.ts → jwt/jwt_claims_set.ts} +3 -3
- package/src/{produce.ts → jwt/produce.ts} +3 -3
- package/src/{sign.ts → jwt/sign.ts} +5 -5
- package/src/{unsecured.ts → jwt/unsecured.ts} +3 -3
- package/src/types.ts +67 -48
- package/src/utils/errors.ts +49 -0
- package/lib/commonjs/jwt_claims_set.js.map +0 -1
- package/lib/commonjs/produce.js.map +0 -1
- package/lib/commonjs/sign.js.map +0 -1
- package/lib/commonjs/unsecured.js.map +0 -1
- package/lib/module/jwt_claims_set.js.map +0 -1
- package/lib/module/produce.js.map +0 -1
- package/lib/module/sign.js.map +0 -1
- package/lib/module/unsecured.js.map +0 -1
- package/lib/typescript/jwt_claims_set.d.ts.map +0 -1
- package/lib/typescript/produce.d.ts.map +0 -1
- package/lib/typescript/sign.d.ts.map +0 -1
- package/lib/typescript/unsecured.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,6DAA6D;IAC7D,MAAM,KAAK,IAAI,IAAI,MAAM,CAExB;IAED,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAsB;gBAEtB,OAAO,CAAC,EAAE,MAAM;CAM7B;AACD,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,KAAK,IAAI,IAAI,iCAAiC,CAEnD;IAED,IAAI,SAAqC;IAEzC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IAEd,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,KAAK,SAAgB,EAAE,MAAM,SAAgB;CAK3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,SAAU,YAAW,wBAAwB;IAC3E,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IAED,IAAI,SAAqB;IAEzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IAEd,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,KAAK,SAAgB,EAAE,MAAM,SAAgB;CAK3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,MAAM,KAAK,IAAI,IAAI,0BAA0B,CAE5C;IAED,IAAI,SAA8B;CACnC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,KAAK,IAAI,IAAI,wBAAwB,CAE1C;IAED,IAAI,SAA4B;CACjC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IAED,IAAI,SAAqB;CAC1B;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IACD,IAAI,SAAqB;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,KAAK,IAAI,IAAI,uCAAuC,CAEzD;IAED,IAAI,SAA2C;IAE/C,OAAO,SAAmC;CAC3C"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAClC,6DAA6D;IAC7D,MAAM,KAAK,IAAI,IAAI,MAAM,CAExB;IAED,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAsB;gBAEtB,OAAO,CAAC,EAAE,MAAM;CAM7B;AACD,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,KAAK,IAAI,IAAI,iCAAiC,CAEnD;IAED,IAAI,SAAqC;IAEzC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IAEd,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,KAAK,SAAgB,EAAE,MAAM,SAAgB;CAK3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,SAAU,YAAW,wBAAwB;IAC3E,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IAED,IAAI,SAAqB;IAEzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IAEd,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EAAE,KAAK,SAAgB,EAAE,MAAM,SAAgB;CAK3E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,MAAM,KAAK,IAAI,IAAI,0BAA0B,CAE5C;IAED,IAAI,SAA8B;CACnC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,KAAK,IAAI,IAAI,wBAAwB,CAE1C;IAED,IAAI,SAA4B;CACjC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IAED,IAAI,SAAqB;CAC1B;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IACD,IAAI,SAAqB;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,8BAA+B,SAAQ,SAAS;IAC3D,MAAM,KAAK,IAAI,IAAI,uCAAuC,CAEzD;IAED,IAAI,SAA2C;IAE/C,OAAO,SAAmC;CAC3C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAEnC;IAED,IAAI,SAAqB;CAC1B;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC1C,MAAM,KAAK,IAAI,IAAI,kBAAkB,CAEpC;IAED,IAAI,SAAsB;CAC3B;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACxC,MAAM,KAAK,IAAI,IAAI,mBAAmB,CAErC;IAED,IAAI,SAAuB;CAC5B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagopa/io-react-native-jwt",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Native support for JWT",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -165,6 +165,7 @@
|
|
|
165
165
|
]
|
|
166
166
|
},
|
|
167
167
|
"dependencies": {
|
|
168
|
-
"abab": "^2.0.6"
|
|
168
|
+
"abab": "^2.0.6",
|
|
169
|
+
"zod": "^3.21.4"
|
|
169
170
|
}
|
|
170
171
|
}
|
package/src/index.tsx
CHANGED
|
@@ -1,120 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { JWSSignatureVerificationFailed } from './utils/errors';
|
|
8
|
-
import { IoReactNativeJwt } from './utils/proxy';
|
|
9
|
-
import { SignJWT } from './sign';
|
|
1
|
+
export * from './jwe/index';
|
|
2
|
+
export * from './jwt/index';
|
|
3
|
+
export * from './jwk/index';
|
|
4
|
+
export * from './jwt/produce';
|
|
5
|
+
export * from './jwt/sign';
|
|
6
|
+
export * from './jwt/unsecured';
|
|
10
7
|
|
|
11
|
-
export * from './produce';
|
|
12
|
-
export * from './sign';
|
|
13
|
-
export * from './unsecured';
|
|
14
8
|
export { derToJose } from './utils/asn1';
|
|
15
9
|
export { encodeBase64, decodeBase64 } from './utils/base64';
|
|
16
10
|
export { sha256ToBase64 } from './hash';
|
|
17
|
-
/**
|
|
18
|
-
* Decode the JWT without validation.
|
|
19
|
-
*
|
|
20
|
-
* @example Usage with a public JWK encoded RSA key
|
|
21
|
-
*
|
|
22
|
-
* ```js
|
|
23
|
-
* const jwt =
|
|
24
|
-
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
25
|
-
*
|
|
26
|
-
* const { payload, protectedHeader } = await decode(jwt)
|
|
27
|
-
*
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* @param jwt JSON Web Token value (encoded as JWS).
|
|
31
|
-
*/
|
|
32
|
-
export const decode = (token: string): JWTDecodeResult => SignJWT.decode(token);
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Verifies the JWS signature
|
|
36
|
-
*
|
|
37
|
-
* @example Usage with a public JWK encoded RSA key
|
|
38
|
-
*
|
|
39
|
-
* ```js
|
|
40
|
-
* const jwk = {
|
|
41
|
-
* crv: 'P-256',
|
|
42
|
-
* kty: 'EC',
|
|
43
|
-
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
44
|
-
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
45
|
-
* }
|
|
46
|
-
* const jwt =
|
|
47
|
-
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
48
|
-
*
|
|
49
|
-
* const isSignatureValid = await verify(jwt, jwk)
|
|
50
|
-
* ```
|
|
51
|
-
*
|
|
52
|
-
* @param jwt JSON Web Token value (encoded as JWS).
|
|
53
|
-
* @param key Public key to verify the JWT in JWK format.
|
|
54
|
-
*/
|
|
55
|
-
export const isSignatureValid = (token: string, jwk: JWK): Promise<boolean> =>
|
|
56
|
-
IoReactNativeJwt.verify(token, jwk);
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Verifies the JWT format (to be a JWS Compact format), verifies the JWS signature, validates the
|
|
60
|
-
* JWT Claims Set.
|
|
61
|
-
*
|
|
62
|
-
* @example Usage with a public JWK encoded RSA key
|
|
63
|
-
*
|
|
64
|
-
* ```js
|
|
65
|
-
* const jwk = {
|
|
66
|
-
* crv: 'P-256',
|
|
67
|
-
* kty: 'EC',
|
|
68
|
-
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
69
|
-
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
70
|
-
* }
|
|
71
|
-
* const jwt =
|
|
72
|
-
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
73
|
-
*
|
|
74
|
-
* const { payload, protectedHeader } = await verify(jwt, jwk, {
|
|
75
|
-
* typ: 'entity-statement+jwt',
|
|
76
|
-
* requiredClaims: ['iss', 'sub', 'metadata'],
|
|
77
|
-
* })
|
|
78
|
-
* ```
|
|
79
|
-
*
|
|
80
|
-
* @param jwt JSON Web Token value (encoded as JWS).
|
|
81
|
-
* @param key Public key to verify the JWT in JWK format.
|
|
82
|
-
* @param options JWT Decryption and JWT Claims Set validation options.
|
|
83
|
-
*/
|
|
84
|
-
export const verify = async (
|
|
85
|
-
token: string,
|
|
86
|
-
jwk: JWK,
|
|
87
|
-
options: JWTClaimVerificationOptions = {}
|
|
88
|
-
): Promise<JWTDecodeResult> => {
|
|
89
|
-
const { protectedHeader, payload } = await decode(token);
|
|
90
|
-
const signatureIsValid = await isSignatureValid(token, jwk);
|
|
91
|
-
|
|
92
|
-
if (signatureIsValid) {
|
|
93
|
-
const verifiedPayload = jwtPayload(protectedHeader, payload, options);
|
|
94
|
-
return { payload: verifiedPayload, protectedHeader };
|
|
95
|
-
} else {
|
|
96
|
-
throw new JWSSignatureVerificationFailed();
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Calculate JWK thumbprint
|
|
102
|
-
*
|
|
103
|
-
* @example Get JWK thumbprint
|
|
104
|
-
*
|
|
105
|
-
* ```js
|
|
106
|
-
* const jwk: JWK = {
|
|
107
|
-
* crv: 'P-256',
|
|
108
|
-
* kty: 'EC',
|
|
109
|
-
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
110
|
-
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
111
|
-
* };
|
|
112
|
-
|
|
113
|
-
* const thumbprint = await thumbprint(jwk)
|
|
114
|
-
*
|
|
115
|
-
* ```
|
|
116
|
-
*
|
|
117
|
-
* @param jwk JSON Web Key
|
|
118
|
-
*/
|
|
119
|
-
export const thumbprint = (jwk: JWK): Promise<string> =>
|
|
120
|
-
IoReactNativeJwt.thumbprint(jwk);
|
package/src/jwe/index.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { JWEHeaderParameters, JWK } from '../types';
|
|
2
|
+
import { IoReactNativeJwt } from '../utils/proxy';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The EncryptJwe class is used to build and encrypt Flattened JWE objects.
|
|
6
|
+
*
|
|
7
|
+
* @example Usage
|
|
8
|
+
*
|
|
9
|
+
* ```js
|
|
10
|
+
* const jwe = await new EncryptJwe(
|
|
11
|
+
* new TextEncoder().encode('It’s a dangerous business, Frodo, going out your door.', { alg: 'RSA-OAEP-256', enc: 'A256GCM' }),
|
|
12
|
+
* )
|
|
13
|
+
* .encrypt(publicKey)
|
|
14
|
+
*
|
|
15
|
+
* console.log(jwe)
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export class EncryptJwe {
|
|
19
|
+
private _plaintext: String;
|
|
20
|
+
private _protectedHeader!: JWEHeaderParameters & { alg: string; enc: string };
|
|
21
|
+
|
|
22
|
+
/** @param plaintext String representation of the plaintext to encrypt. */
|
|
23
|
+
/** @param header JWE header with alg and enc parameters. */
|
|
24
|
+
constructor(
|
|
25
|
+
plaintext: String,
|
|
26
|
+
header: JWEHeaderParameters & { alg: string; enc: string }
|
|
27
|
+
) {
|
|
28
|
+
this._plaintext = plaintext;
|
|
29
|
+
this._protectedHeader = header;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Encrypts and resolves the value of the Flattened JWE object.
|
|
34
|
+
*
|
|
35
|
+
* @param key Public Key or Secret to encrypt the JWE with. See
|
|
36
|
+
*/
|
|
37
|
+
async encrypt(key: JWK): Promise<string> {
|
|
38
|
+
let jwe = await IoReactNativeJwt.enc(
|
|
39
|
+
this._plaintext,
|
|
40
|
+
this._protectedHeader,
|
|
41
|
+
key
|
|
42
|
+
);
|
|
43
|
+
return jwe;
|
|
44
|
+
}
|
|
45
|
+
}
|
package/src/jwk/index.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { IoReactNativeJwt } from '../utils/proxy';
|
|
2
|
+
import { WithJWKS, JWK } from '../types';
|
|
3
|
+
import { JWKSetInvalid } from '../utils/errors';
|
|
4
|
+
import { decode } from '..';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Calculate JWK thumbprint
|
|
8
|
+
*
|
|
9
|
+
* @example Get JWK thumbprint
|
|
10
|
+
*
|
|
11
|
+
* ```js
|
|
12
|
+
* const jwk: JWK = {
|
|
13
|
+
* crv: 'P-256',
|
|
14
|
+
* kty: 'EC',
|
|
15
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
16
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
17
|
+
* };
|
|
18
|
+
|
|
19
|
+
* const thumbprint = await thumbprint(jwk)
|
|
20
|
+
*
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @param jwk JSON Web Key
|
|
24
|
+
*/
|
|
25
|
+
export const thumbprint = (jwk: JWK): Promise<string> =>
|
|
26
|
+
IoReactNativeJwt.thumbprint(jwk);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Returns a JSON Web Key Set (JWKS) downloaded from a remote endpoint,
|
|
30
|
+
* that is, for example, an OAuth 2.0 or OIDC jwks_uri.
|
|
31
|
+
*
|
|
32
|
+
* @param url URL string to fetch the JSON Web Key Set from.
|
|
33
|
+
* @param appFetch fetch function (optional)
|
|
34
|
+
*/
|
|
35
|
+
export const getRemoteJWKSet = async (
|
|
36
|
+
url: string,
|
|
37
|
+
appFetch: GlobalFetch['fetch'] = fetch
|
|
38
|
+
): Promise<JWK[]> => {
|
|
39
|
+
let response = await appFetch(url);
|
|
40
|
+
|
|
41
|
+
if (response.status === 200) {
|
|
42
|
+
const jwt = await response.text();
|
|
43
|
+
const { payload } = await decode(jwt);
|
|
44
|
+
const parsedPayload = WithJWKS.parse(payload);
|
|
45
|
+
return parsedPayload.jwks.keys;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
throw new JWKSetInvalid(
|
|
49
|
+
`Unable to obtain JWKSet from given url. Response status: ${response.status}`
|
|
50
|
+
);
|
|
51
|
+
};
|
package/src/jwt/index.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
JWSHeaderParameters,
|
|
3
|
+
JWTClaimVerificationOptions,
|
|
4
|
+
JWTDecodeResult,
|
|
5
|
+
} from '../types';
|
|
6
|
+
import jwtPayload from './jwt_claims_set';
|
|
7
|
+
import { JWKNotFound, JWSSignatureVerificationFailed } from '../utils/errors';
|
|
8
|
+
import { IoReactNativeJwt } from '../utils/proxy';
|
|
9
|
+
import { SignJWT } from './sign';
|
|
10
|
+
import type { JWK } from '../types';
|
|
11
|
+
import { getKtyFromAlg } from '../algorithms';
|
|
12
|
+
|
|
13
|
+
export * from './produce';
|
|
14
|
+
export * from './sign';
|
|
15
|
+
export * from './unsecured';
|
|
16
|
+
export { derToJose } from '../utils/asn1';
|
|
17
|
+
export { encodeBase64, decodeBase64 } from '../utils/base64';
|
|
18
|
+
export { sha256ToBase64 } from '../hash';
|
|
19
|
+
/**
|
|
20
|
+
* Decode the JWT without validation.
|
|
21
|
+
*
|
|
22
|
+
* @example Usage with a public JWK encoded RSA key
|
|
23
|
+
*
|
|
24
|
+
* ```js
|
|
25
|
+
* const jwt =
|
|
26
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
27
|
+
*
|
|
28
|
+
* const { payload, protectedHeader } = await decode(jwt)
|
|
29
|
+
*
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
33
|
+
*/
|
|
34
|
+
export const decode = (token: string): JWTDecodeResult => SignJWT.decode(token);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Verifies the JWS signature
|
|
38
|
+
*
|
|
39
|
+
* @example Usage with a public JWK encoded RSA key
|
|
40
|
+
*
|
|
41
|
+
* ```js
|
|
42
|
+
* const jwk = {
|
|
43
|
+
* crv: 'P-256',
|
|
44
|
+
* kty: 'EC',
|
|
45
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
46
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
47
|
+
* }
|
|
48
|
+
* const jwt =
|
|
49
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
50
|
+
*
|
|
51
|
+
* const isSignatureValid = await verify(jwt, jwk)
|
|
52
|
+
* ```
|
|
53
|
+
*
|
|
54
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
55
|
+
* @param key Public key to verify the JWT in JWK format.
|
|
56
|
+
*/
|
|
57
|
+
export const isSignatureValid = (token: string, jwk: JWK): Promise<boolean> =>
|
|
58
|
+
IoReactNativeJwt.verify(token, jwk);
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Verifies the JWT format (to be a JWS Compact format), verifies the JWS signature, validates the
|
|
62
|
+
* JWT Claims Set.
|
|
63
|
+
*
|
|
64
|
+
* @example Usage with a public JWK encoded RSA key
|
|
65
|
+
*
|
|
66
|
+
* ```js
|
|
67
|
+
* const jwk = {
|
|
68
|
+
* crv: 'P-256',
|
|
69
|
+
* kty: 'EC',
|
|
70
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
71
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
72
|
+
* }
|
|
73
|
+
* const jwt =
|
|
74
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
75
|
+
*
|
|
76
|
+
* const { payload, protectedHeader } = await verify(jwt, jwk, {
|
|
77
|
+
* typ: 'entity-statement+jwt',
|
|
78
|
+
* requiredClaims: ['iss', 'sub', 'metadata'],
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* * @example Usage with a JWKSet
|
|
83
|
+
*
|
|
84
|
+
* ```js
|
|
85
|
+
* const wellKnownUrl = 'https://example.com/.well-known/openid-federation';
|
|
86
|
+
* const jwks = await getRemoteJWKSet(wellKnownUrl);
|
|
87
|
+
*
|
|
88
|
+
* const jwt =
|
|
89
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
90
|
+
*
|
|
91
|
+
* const { payload, protectedHeader } = await verify(jwt, jwks, {
|
|
92
|
+
* typ: 'entity-statement+jwt',
|
|
93
|
+
* requiredClaims: ['iss', 'sub', 'metadata'],
|
|
94
|
+
* })
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
98
|
+
* @param key Public key to verify the JWT in JWK format or JWKS (array of JWK).
|
|
99
|
+
* @param options JWT Decryption and JWT Claims Set validation options.
|
|
100
|
+
*/
|
|
101
|
+
export const verify = async (
|
|
102
|
+
token: string,
|
|
103
|
+
jwk: JWK | JWK[],
|
|
104
|
+
options: JWTClaimVerificationOptions = {}
|
|
105
|
+
): Promise<JWTDecodeResult> => {
|
|
106
|
+
const { protectedHeader, payload } = await decode(token);
|
|
107
|
+
|
|
108
|
+
const selectedJwk = Array.isArray(jwk)
|
|
109
|
+
? getJwkFromHeader(protectedHeader, jwk)
|
|
110
|
+
: jwk;
|
|
111
|
+
|
|
112
|
+
const signatureIsValid = await isSignatureValid(token, selectedJwk);
|
|
113
|
+
if (signatureIsValid) {
|
|
114
|
+
const verifiedPayload = jwtPayload(protectedHeader, payload, options);
|
|
115
|
+
return { payload: verifiedPayload, protectedHeader };
|
|
116
|
+
} else {
|
|
117
|
+
throw new JWSSignatureVerificationFailed();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Given the header of a JWT return the corresponding key from a JWKS.
|
|
123
|
+
*
|
|
124
|
+
* It uses the "alg" (JWS Algorithm) Header Parameter to determine the right JWK "kty" (Key Type),
|
|
125
|
+
* then proceeds to match the JWK "kid" (Key ID) with one found in the JWS Header Parameters (if
|
|
126
|
+
* there is one).
|
|
127
|
+
* Only a single public key must match the selection process.
|
|
128
|
+
*
|
|
129
|
+
* @param header JWT header
|
|
130
|
+
* @param jwks Json Web Key Set (JWKS)
|
|
131
|
+
*
|
|
132
|
+
*/
|
|
133
|
+
export const getJwkFromHeader = (
|
|
134
|
+
header: JWSHeaderParameters,
|
|
135
|
+
jwks: JWK[]
|
|
136
|
+
): JWK => {
|
|
137
|
+
const { alg, kid } = header;
|
|
138
|
+
if (alg && kid) {
|
|
139
|
+
const kty = getKtyFromAlg(alg);
|
|
140
|
+
const filteredJwks = jwks.find((el) => el.kty === kty && el.kid === kid);
|
|
141
|
+
|
|
142
|
+
if (filteredJwks) {
|
|
143
|
+
return filteredJwks;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
throw new JWKNotFound(`No JWKs found that match alg:${alg} and kid:${kid}`);
|
|
148
|
+
};
|
|
@@ -5,10 +5,10 @@ import type {
|
|
|
5
5
|
JWTPayload,
|
|
6
6
|
JWTClaimVerificationOptions,
|
|
7
7
|
JWSHeaderParameters,
|
|
8
|
-
} from '
|
|
9
|
-
import { JWTClaimValidationFailed, JWTExpired } from '
|
|
8
|
+
} from '../types';
|
|
9
|
+
import { JWTClaimValidationFailed, JWTExpired } from '../utils/errors';
|
|
10
10
|
|
|
11
|
-
import secs, { epoch } from '
|
|
11
|
+
import secs, { epoch } from '../utils/secs';
|
|
12
12
|
|
|
13
13
|
const normalizeTyp = (value: string) =>
|
|
14
14
|
value.toLowerCase().replace(/^application\//, '');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { JWTPayload } from '
|
|
2
|
-
import isObject from '
|
|
3
|
-
import secs, { epoch } from '
|
|
1
|
+
import type { JWTPayload } from '../types';
|
|
2
|
+
import isObject from '../utils/is_object';
|
|
3
|
+
import secs, { epoch } from '../utils/secs';
|
|
4
4
|
|
|
5
5
|
/** Generic class for JWT producing. */
|
|
6
6
|
export class ProduceJWT {
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { JOSENotSupported, JWSInvalid, JWTInvalid } from '
|
|
1
|
+
import { JOSENotSupported, JWSInvalid, JWTInvalid } from '../utils/errors';
|
|
2
2
|
import type {
|
|
3
3
|
CompactJWSHeaderParameters,
|
|
4
4
|
JWTDecodeResult,
|
|
5
5
|
JWTPayload,
|
|
6
|
-
} from '
|
|
6
|
+
} from '../types';
|
|
7
7
|
import { ProduceJWT } from './produce';
|
|
8
|
-
import { decodeBase64, encodeBase64, removePadding } from '
|
|
9
|
-
import { isAlgSupported } from '
|
|
8
|
+
import { decodeBase64, encodeBase64, removePadding } from '../utils/base64';
|
|
9
|
+
import { isAlgSupported } from '../algorithms';
|
|
10
10
|
|
|
11
|
-
import { derToJose } from '
|
|
11
|
+
import { derToJose } from '../utils/asn1';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* The SignJWT class is used to build and sign Compact JWS formatted JSON Web Tokens.
|
|
@@ -2,12 +2,12 @@ import type {
|
|
|
2
2
|
JWSHeaderParameters,
|
|
3
3
|
JWTClaimVerificationOptions,
|
|
4
4
|
JWTPayload,
|
|
5
|
-
} from '
|
|
5
|
+
} from '../types';
|
|
6
6
|
|
|
7
|
-
import { JWTInvalid } from '
|
|
7
|
+
import { JWTInvalid } from '../utils/errors';
|
|
8
8
|
import jwtPayload from './jwt_claims_set';
|
|
9
9
|
import { ProduceJWT } from './produce';
|
|
10
|
-
import { decodeBase64, encodeBase64 } from '
|
|
10
|
+
import { decodeBase64, encodeBase64 } from '../utils/base64';
|
|
11
11
|
|
|
12
12
|
export interface UnsecuredResult {
|
|
13
13
|
payload: JWTPayload;
|
package/src/types.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
1
3
|
export interface JWTDecodeResult {
|
|
2
4
|
/** JWT Claims Set. */
|
|
3
5
|
payload: JWTPayload;
|
|
@@ -6,54 +8,6 @@ export interface JWTDecodeResult {
|
|
|
6
8
|
protectedHeader: JWSHeaderParameters;
|
|
7
9
|
}
|
|
8
10
|
|
|
9
|
-
/**
|
|
10
|
-
* JSON Web Key ({@link https://www.rfc-editor.org/rfc/rfc7517 JWK}). "RSA", "EC", "OKP", and "oct"
|
|
11
|
-
* key types are supported.
|
|
12
|
-
*/
|
|
13
|
-
export interface JWK {
|
|
14
|
-
/** JWK "alg" (Algorithm) Parameter. */
|
|
15
|
-
'alg'?: string;
|
|
16
|
-
'crv'?: string;
|
|
17
|
-
'd'?: string;
|
|
18
|
-
'dp'?: string;
|
|
19
|
-
'dq'?: string;
|
|
20
|
-
'e'?: string;
|
|
21
|
-
/** JWK "ext" (Extractable) Parameter. */
|
|
22
|
-
'ext'?: boolean;
|
|
23
|
-
'k'?: string;
|
|
24
|
-
/** JWK "key_ops" (Key Operations) Parameter. */
|
|
25
|
-
'key_ops'?: string[];
|
|
26
|
-
/** JWK "kid" (Key ID) Parameter. */
|
|
27
|
-
'kid'?: string;
|
|
28
|
-
/** JWK "kty" (Key Type) Parameter.
|
|
29
|
-
* This attribute is required to discriminate the
|
|
30
|
-
* type of EC/RSA algorithm */
|
|
31
|
-
'kty': string;
|
|
32
|
-
'n'?: string;
|
|
33
|
-
'oth'?: Array<{
|
|
34
|
-
d?: string;
|
|
35
|
-
r?: string;
|
|
36
|
-
t?: string;
|
|
37
|
-
}>;
|
|
38
|
-
'p'?: string;
|
|
39
|
-
'q'?: string;
|
|
40
|
-
'qi'?: string;
|
|
41
|
-
/** JWK "use" (Public Key Use) Parameter. */
|
|
42
|
-
'use'?: string;
|
|
43
|
-
'x'?: string;
|
|
44
|
-
'y'?: string;
|
|
45
|
-
/** JWK "x5c" (X.509 Certificate Chain) Parameter. */
|
|
46
|
-
'x5c'?: string[];
|
|
47
|
-
/** JWK "x5t" (X.509 Certificate SHA-1 Thumbprint) Parameter. */
|
|
48
|
-
'x5t'?: string;
|
|
49
|
-
/** "x5t#S256" (X.509 Certificate SHA-256 Thumbprint) Parameter. */
|
|
50
|
-
'x5t#S256'?: string;
|
|
51
|
-
/** JWK "x5u" (X.509 URL) Parameter. */
|
|
52
|
-
'x5u'?: string;
|
|
53
|
-
|
|
54
|
-
[propName: string]: unknown;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
11
|
export interface JoseHeaderParameters {
|
|
58
12
|
/** "kid" (Key ID) Header Parameter. */
|
|
59
13
|
kid?: string;
|
|
@@ -103,6 +57,18 @@ export interface CompactJWSHeaderParameters extends JWSHeaderParameters {
|
|
|
103
57
|
alg: string;
|
|
104
58
|
}
|
|
105
59
|
|
|
60
|
+
/** Recognized JWE Header Parameters, any other Header members may also be present. */
|
|
61
|
+
export interface JWEHeaderParameters extends JoseHeaderParameters {
|
|
62
|
+
/** JWE "alg" (Algorithm) Header Parameter. */
|
|
63
|
+
alg?: 'RSA-OAEP-256' | 'RSA-OAEP';
|
|
64
|
+
|
|
65
|
+
/** JWE "enc" (Encryption Algorithm) Header Parameter. */
|
|
66
|
+
enc?: 'A256CBC-HS512' | 'A128CBC-HS256';
|
|
67
|
+
|
|
68
|
+
/** Any other JWE Header member. */
|
|
69
|
+
[propName: string]: unknown;
|
|
70
|
+
}
|
|
71
|
+
|
|
106
72
|
/** Recognized JWT Claims Set members, any other members may also be present. */
|
|
107
73
|
export interface JWTPayload {
|
|
108
74
|
/**
|
|
@@ -201,3 +167,56 @@ export interface JWTClaimVerificationOptions {
|
|
|
201
167
|
*/
|
|
202
168
|
requiredClaims?: string[];
|
|
203
169
|
}
|
|
170
|
+
|
|
171
|
+
export type JWK = z.infer<typeof JWK>;
|
|
172
|
+
export const JWK = z.object({
|
|
173
|
+
'alg': z.string().optional(),
|
|
174
|
+
'crv': z.string().optional(),
|
|
175
|
+
'd': z.string().optional(),
|
|
176
|
+
'dp': z.string().optional(),
|
|
177
|
+
'dq': z.string().optional(),
|
|
178
|
+
'e': z.string().optional(),
|
|
179
|
+
/** JWK "ext" (Extractable) Parameter. */
|
|
180
|
+
'ext': z.boolean().optional(),
|
|
181
|
+
'k': z.string().optional(),
|
|
182
|
+
/** JWK "key_ops" (Key Operations) Parameter. */
|
|
183
|
+
'key_ops': z.array(z.string()).optional(),
|
|
184
|
+
/** JWK "kid" (Key ID) Parameter. */
|
|
185
|
+
'kid': z.string().optional(),
|
|
186
|
+
/** JWK "kty" (Key Type) Parameter.
|
|
187
|
+
* This attribute is required to discriminate the
|
|
188
|
+
* type of EC/RSA algorithm */
|
|
189
|
+
'kty': z.string(),
|
|
190
|
+
'n': z.string().optional(),
|
|
191
|
+
'oth': z
|
|
192
|
+
.array(
|
|
193
|
+
z.object({
|
|
194
|
+
d: z.string().optional(),
|
|
195
|
+
r: z.string().optional(),
|
|
196
|
+
t: z.string().optional(),
|
|
197
|
+
})
|
|
198
|
+
)
|
|
199
|
+
.optional(),
|
|
200
|
+
'p': z.string().optional(),
|
|
201
|
+
'q': z.string().optional(),
|
|
202
|
+
'qi': z.string().optional(),
|
|
203
|
+
/** JWK "use" (Public Key Use) Parameter. */
|
|
204
|
+
'use': z.string().optional(),
|
|
205
|
+
'x': z.string().optional(),
|
|
206
|
+
'y': z.string().optional(),
|
|
207
|
+
/** JWK "x5c" (X.509 Certificate Chain) Parameter. */
|
|
208
|
+
'x5c': z.array(z.string()).optional(),
|
|
209
|
+
/** JWK "x5t" (X.509 Certificate SHA-1 Thumbprint) Parameter. */
|
|
210
|
+
'x5t': z.string().optional(),
|
|
211
|
+
/** "x5t#S256" (X.509 Certificate SHA-256 Thumbprint) Parameter. */
|
|
212
|
+
'x5t#S256': z.string().optional(),
|
|
213
|
+
/** JWK "x5u" (X.509 URL) Parameter. */
|
|
214
|
+
'x5u': z.string().optional(),
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
export type WithJWKS = z.infer<typeof WithJWKS>;
|
|
218
|
+
export const WithJWKS = z.object({
|
|
219
|
+
jwks: z.object({
|
|
220
|
+
keys: z.array(JWK),
|
|
221
|
+
}),
|
|
222
|
+
});
|
package/src/utils/errors.ts
CHANGED
|
@@ -204,3 +204,52 @@ export class JWSSignatureVerificationFailed extends JOSEError {
|
|
|
204
204
|
|
|
205
205
|
message = 'signature verification failed';
|
|
206
206
|
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* An error subclass thrown when a JWE is invalid.
|
|
210
|
+
*
|
|
211
|
+
* @example Checking thrown error is this one using a stable error code
|
|
212
|
+
*
|
|
213
|
+
* ```js
|
|
214
|
+
* if (err.code === 'ERR_JWE_INVALID') {
|
|
215
|
+
* // ...
|
|
216
|
+
* }
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* @example Checking thrown error is this one using `instanceof`
|
|
220
|
+
*
|
|
221
|
+
* ```js
|
|
222
|
+
* if (err instanceof errors.JWEInvalid) {
|
|
223
|
+
* // ...
|
|
224
|
+
* }
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export class JWEInvalid extends JOSEError {
|
|
228
|
+
static get code(): 'ERR_JWE_INVALID' {
|
|
229
|
+
return 'ERR_JWE_INVALID';
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
code = 'ERR_JWE_INVALID';
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* An error subclass thrown when a JWKSet is invalid.
|
|
237
|
+
*/
|
|
238
|
+
export class JWKSetInvalid extends JOSEError {
|
|
239
|
+
static get code(): 'ERR_JWKS_INVALID' {
|
|
240
|
+
return 'ERR_JWKS_INVALID';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
code = 'ERR_JWKS_INVALID';
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* An error subclass thrown when a JWK is not found.
|
|
248
|
+
*/
|
|
249
|
+
export class JWKNotFound extends JOSEError {
|
|
250
|
+
static get code(): 'ERR_JWK_NOT_FOUND' {
|
|
251
|
+
return 'ERR_JWK_NOT_FOUND';
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
code = 'ERR_JWK_NOT_FOUND';
|
|
255
|
+
}
|