@pagopa/io-react-native-jwt 0.4.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 +20 -0
- package/README.md +145 -0
- package/android/build.gradle +97 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/com/pagopa/ioreactnativejwt/IoReactNativeJwtModule.kt +114 -0
- package/android/src/main/java/com/pagopa/ioreactnativejwt/IoReactNativeJwtPackage.kt +17 -0
- package/android/src/main/java/com/pagopa/ioreactnativejwt/Utils.kt +95 -0
- package/ios/ASN1DERParsing.swift +226 -0
- package/ios/IoReactNativeJwt-Bridging-Header.h +2 -0
- package/ios/IoReactNativeJwt.mm +28 -0
- package/ios/IoReactNativeJwt.swift +156 -0
- package/ios/IoReactNativeJwt.xcodeproj/project.pbxproj +283 -0
- package/lib/commonjs/algorithms.js +39 -0
- package/lib/commonjs/algorithms.js.map +1 -0
- package/lib/commonjs/hash.js +17 -0
- package/lib/commonjs/hash.js.map +1 -0
- package/lib/commonjs/index.js +194 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/jwt_claims_set.js +112 -0
- package/lib/commonjs/jwt_claims_set.js.map +1 -0
- package/lib/commonjs/produce.js +140 -0
- package/lib/commonjs/produce.js.map +1 -0
- package/lib/commonjs/sign.js +159 -0
- package/lib/commonjs/sign.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/unsecured.js +118 -0
- package/lib/commonjs/unsecured.js.map +1 -0
- package/lib/commonjs/utils/asn1.js +37 -0
- package/lib/commonjs/utils/asn1.js.map +1 -0
- package/lib/commonjs/utils/base64.js +43 -0
- package/lib/commonjs/utils/base64.js.map +1 -0
- package/lib/commonjs/utils/errors.js +214 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/is_object.js +23 -0
- package/lib/commonjs/utils/is_object.js.map +1 -0
- package/lib/commonjs/utils/proxy.js +17 -0
- package/lib/commonjs/utils/proxy.js.map +1 -0
- package/lib/commonjs/utils/secs.js +61 -0
- package/lib/commonjs/utils/secs.js.map +1 -0
- package/lib/module/algorithms.js +29 -0
- package/lib/module/algorithms.js.map +1 -0
- package/lib/module/hash.js +11 -0
- package/lib/module/hash.js.map +1 -0
- package/lib/module/index.js +115 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/jwt_claims_set.js +103 -0
- package/lib/module/jwt_claims_set.js.map +1 -0
- package/lib/module/produce.js +131 -0
- package/lib/module/produce.js.map +1 -0
- package/lib/module/sign.js +153 -0
- package/lib/module/sign.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/unsecured.js +110 -0
- package/lib/module/unsecured.js.map +1 -0
- package/lib/module/utils/asn1.js +31 -0
- package/lib/module/utils/asn1.js.map +1 -0
- package/lib/module/utils/base64.js +36 -0
- package/lib/module/utils/base64.js.map +1 -0
- package/lib/module/utils/errors.js +200 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/is_object.js +17 -0
- package/lib/module/utils/is_object.js.map +1 -0
- package/lib/module/utils/proxy.js +10 -0
- package/lib/module/utils/proxy.js.map +1 -0
- package/lib/module/utils/secs.js +53 -0
- package/lib/module/utils/secs.js.map +1 -0
- package/lib/typescript/algorithms.d.ts +5 -0
- package/lib/typescript/algorithms.d.ts.map +1 -0
- package/lib/typescript/hash.d.ts +5 -0
- package/lib/typescript/hash.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +93 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/jwt_claims_set.d.ts +4 -0
- package/lib/typescript/jwt_claims_set.d.ts.map +1 -0
- package/lib/typescript/produce.d.ts +55 -0
- package/lib/typescript/produce.d.ts.map +1 -0
- package/lib/typescript/sign.d.ts +61 -0
- package/lib/typescript/sign.d.ts.map +1 -0
- package/lib/typescript/types.d.ts +172 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/unsecured.d.ts +64 -0
- package/lib/typescript/unsecured.d.ts.map +1 -0
- package/lib/typescript/utils/asn1.d.ts +2 -0
- package/lib/typescript/utils/asn1.d.ts.map +1 -0
- package/lib/typescript/utils/base64.d.ts +4 -0
- package/lib/typescript/utils/base64.d.ts.map +1 -0
- package/lib/typescript/utils/errors.d.ts +157 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -0
- package/lib/typescript/utils/is_object.d.ts +2 -0
- package/lib/typescript/utils/is_object.d.ts.map +1 -0
- package/lib/typescript/utils/proxy.d.ts +2 -0
- package/lib/typescript/utils/proxy.d.ts.map +1 -0
- package/lib/typescript/utils/secs.d.ts +4 -0
- package/lib/typescript/utils/secs.d.ts.map +1 -0
- package/package.json +170 -0
- package/pagopa-io-react-native-jwt.podspec +44 -0
- package/src/algorithms.ts +46 -0
- package/src/hash.ts +10 -0
- package/src/index.tsx +120 -0
- package/src/jwt_claims_set.ts +194 -0
- package/src/produce.ts +109 -0
- package/src/sign.ts +180 -0
- package/src/types.ts +203 -0
- package/src/unsecured.ts +127 -0
- package/src/utils/asn1.ts +36 -0
- package/src/utils/base64.ts +37 -0
- package/src/utils/errors.ts +206 -0
- package/src/utils/is_object.ts +20 -0
- package/src/utils/proxy.ts +15 -0
- package/src/utils/secs.ts +58 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.epoch = exports.default = void 0;
|
|
7
|
+
const minute = 60;
|
|
8
|
+
const hour = minute * 60;
|
|
9
|
+
const day = hour * 24;
|
|
10
|
+
const week = day * 7;
|
|
11
|
+
const year = day * 365.25;
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* It allows to extract the value and the unit of measurement for the time.
|
|
15
|
+
* For example, indicating a string like "1s" or "1 second" or "3 hour"
|
|
16
|
+
* the regex extracts a group made up of [1, "s"], [1, "second"] or [3, "hour"]
|
|
17
|
+
*/
|
|
18
|
+
const REGEX = /^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;
|
|
19
|
+
var _default = str => {
|
|
20
|
+
const matched = REGEX.exec(str);
|
|
21
|
+
if (!matched) {
|
|
22
|
+
throw new TypeError('Invalid time period format');
|
|
23
|
+
}
|
|
24
|
+
const value = parseFloat(matched[1]);
|
|
25
|
+
const unit = matched[2].toLowerCase();
|
|
26
|
+
switch (unit) {
|
|
27
|
+
case 'sec':
|
|
28
|
+
case 'secs':
|
|
29
|
+
case 'second':
|
|
30
|
+
case 'seconds':
|
|
31
|
+
case 's':
|
|
32
|
+
return Math.round(value);
|
|
33
|
+
case 'minute':
|
|
34
|
+
case 'minutes':
|
|
35
|
+
case 'min':
|
|
36
|
+
case 'mins':
|
|
37
|
+
case 'm':
|
|
38
|
+
return Math.round(value * minute);
|
|
39
|
+
case 'hour':
|
|
40
|
+
case 'hours':
|
|
41
|
+
case 'hr':
|
|
42
|
+
case 'hrs':
|
|
43
|
+
case 'h':
|
|
44
|
+
return Math.round(value * hour);
|
|
45
|
+
case 'day':
|
|
46
|
+
case 'days':
|
|
47
|
+
case 'd':
|
|
48
|
+
return Math.round(value * day);
|
|
49
|
+
case 'week':
|
|
50
|
+
case 'weeks':
|
|
51
|
+
case 'w':
|
|
52
|
+
return Math.round(value * week);
|
|
53
|
+
// years matched
|
|
54
|
+
default:
|
|
55
|
+
return Math.round(value * year);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
exports.default = _default;
|
|
59
|
+
const epoch = date => Math.floor(date.getTime() / 1000);
|
|
60
|
+
exports.epoch = epoch;
|
|
61
|
+
//# sourceMappingURL=secs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["minute","hour","day","week","year","REGEX","_default","str","matched","exec","TypeError","value","parseFloat","unit","toLowerCase","Math","round","exports","default","epoch","date","floor","getTime"],"sourceRoot":"../../../src","sources":["utils/secs.ts"],"mappings":";;;;;;AAAA,MAAMA,MAAM,GAAG,EAAE;AACjB,MAAMC,IAAI,GAAGD,MAAM,GAAG,EAAE;AACxB,MAAME,GAAG,GAAGD,IAAI,GAAG,EAAE;AACrB,MAAME,IAAI,GAAGD,GAAG,GAAG,CAAC;AACpB,MAAME,IAAI,GAAGF,GAAG,GAAG,MAAM;;AAEzB;AACA;AACA;AACA;AACA;AACA,MAAMG,KAAK,GACT,qGAAqG;AAAC,IAAAC,QAAA,GAExFC,GAAW,IAAa;EACtC,MAAMC,OAAO,GAAGH,KAAK,CAACI,IAAI,CAACF,GAAG,CAAC;EAE/B,IAAI,CAACC,OAAO,EAAE;IACZ,MAAM,IAAIE,SAAS,CAAC,4BAA4B,CAAC;EACnD;EAEA,MAAMC,KAAK,GAAGC,UAAU,CAACJ,OAAO,CAAC,CAAC,CAAE,CAAC;EACrC,MAAMK,IAAI,GAAGL,OAAO,CAAC,CAAC,CAAC,CAAEM,WAAW,CAAC,CAAC;EAEtC,QAAQD,IAAI;IACV,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,GAAG;MACN,OAAOE,IAAI,CAACC,KAAK,CAACL,KAAK,CAAC;IAC1B,KAAK,QAAQ;IACb,KAAK,SAAS;IACd,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,GAAG;MACN,OAAOI,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGX,MAAM,CAAC;IACnC,KAAK,MAAM;IACX,KAAK,OAAO;IACZ,KAAK,IAAI;IACT,KAAK,KAAK;IACV,KAAK,GAAG;MACN,OAAOe,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGV,IAAI,CAAC;IACjC,KAAK,KAAK;IACV,KAAK,MAAM;IACX,KAAK,GAAG;MACN,OAAOc,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGT,GAAG,CAAC;IAChC,KAAK,MAAM;IACX,KAAK,OAAO;IACZ,KAAK,GAAG;MACN,OAAOa,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGR,IAAI,CAAC;IACjC;IACA;MACE,OAAOY,IAAI,CAACC,KAAK,CAACL,KAAK,GAAGP,IAAI,CAAC;EACnC;AACF,CAAC;AAAAa,OAAA,CAAAC,OAAA,GAAAZ,QAAA;AAEM,MAAMa,KAAK,GAAIC,IAAU,IAAKL,IAAI,CAACM,KAAK,CAACD,IAAI,CAACE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;AAACL,OAAA,CAAAE,KAAA,GAAAA,KAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { JOSENotSupported } from './utils/errors';
|
|
2
|
+
export const supportedAlgorithms = ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512'];
|
|
3
|
+
export const isAlgSupported = alg => supportedAlgorithms.includes(alg.toUpperCase());
|
|
4
|
+
export const getKtyFromAlg = alg => {
|
|
5
|
+
switch (alg.slice(0, 2)) {
|
|
6
|
+
case 'RS':
|
|
7
|
+
case 'PS':
|
|
8
|
+
return 'RSA';
|
|
9
|
+
case 'ES':
|
|
10
|
+
return 'EC';
|
|
11
|
+
default:
|
|
12
|
+
throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// Coordinates length in bytes: bits/8
|
|
17
|
+
export const getCoordinateOctetLength = alg => {
|
|
18
|
+
switch (alg.slice(2, 5)) {
|
|
19
|
+
case '256':
|
|
20
|
+
return 32;
|
|
21
|
+
case '384':
|
|
22
|
+
return 48;
|
|
23
|
+
case '512':
|
|
24
|
+
return 66;
|
|
25
|
+
default:
|
|
26
|
+
throw new JOSENotSupported('Unsupported "alg" value for a JSON Web Key Set');
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=algorithms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["JOSENotSupported","supportedAlgorithms","isAlgSupported","alg","includes","toUpperCase","getKtyFromAlg","slice","getCoordinateOctetLength"],"sourceRoot":"../../src","sources":["algorithms.ts"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,gBAAgB;AAEjD,OAAO,MAAMC,mBAAmB,GAAG,CACjC,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,CACR;AAED,OAAO,MAAMC,cAAc,GAAIC,GAAW,IACxCF,mBAAmB,CAACG,QAAQ,CAACD,GAAG,CAACE,WAAW,CAAC,CAAC,CAAC;AAEjD,OAAO,MAAMC,aAAa,GAAIH,GAAW,IAAK;EAC5C,QAAQA,GAAG,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,KAAK,IAAI;IACT,KAAK,IAAI;MACP,OAAO,KAAK;IACd,KAAK,IAAI;MACP,OAAO,IAAI;IACb;MACE,MAAM,IAAIP,gBAAgB,CACxB,gDACF,CAAC;EACL;AACF,CAAC;;AAED;AACA,OAAO,MAAMQ,wBAAwB,GAAIL,GAAW,IAAK;EACvD,QAAQA,GAAG,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACrB,KAAK,KAAK;MACR,OAAO,EAAE;IACX,KAAK,KAAK;MACR,OAAO,EAAE;IACX,KAAK,KAAK;MACR,OAAO,EAAE;IACX;MACE,MAAM,IAAIP,gBAAgB,CACxB,gDACF,CAAC;EACL;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { removePadding } from './utils/base64';
|
|
2
|
+
import { IoReactNativeJwt } from './utils/proxy';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Return base64 encoded SHA256 hash of input string
|
|
6
|
+
*/
|
|
7
|
+
export const sha256ToBase64 = async toHash => {
|
|
8
|
+
let hash = await IoReactNativeJwt.sha256(toHash);
|
|
9
|
+
return removePadding(hash);
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["removePadding","IoReactNativeJwt","sha256ToBase64","toHash","hash","sha256"],"sourceRoot":"../../src","sources":["hash.ts"],"mappings":"AAAA,SAASA,aAAa,QAAQ,gBAAgB;AAC9C,SAASC,gBAAgB,QAAQ,eAAe;;AAEhD;AACA;AACA;AACA,OAAO,MAAMC,cAAc,GAAG,MAAOC,MAAc,IAAsB;EACvE,IAAIC,IAAI,GAAG,MAAMH,gBAAgB,CAACI,MAAM,CAACF,MAAM,CAAC;EAChD,OAAOH,aAAa,CAACI,IAAI,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import jwtPayload from './jwt_claims_set';
|
|
2
|
+
import { JWSSignatureVerificationFailed } from './utils/errors';
|
|
3
|
+
import { IoReactNativeJwt } from './utils/proxy';
|
|
4
|
+
import { SignJWT } from './sign';
|
|
5
|
+
export * from './produce';
|
|
6
|
+
export * from './sign';
|
|
7
|
+
export * from './unsecured';
|
|
8
|
+
export { derToJose } from './utils/asn1';
|
|
9
|
+
export { encodeBase64, decodeBase64 } from './utils/base64';
|
|
10
|
+
export { sha256ToBase64 } from './hash';
|
|
11
|
+
/**
|
|
12
|
+
* Decode the JWT without validation.
|
|
13
|
+
*
|
|
14
|
+
* @example Usage with a public JWK encoded RSA key
|
|
15
|
+
*
|
|
16
|
+
* ```js
|
|
17
|
+
* const jwt =
|
|
18
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
19
|
+
*
|
|
20
|
+
* const { payload, protectedHeader } = await decode(jwt)
|
|
21
|
+
*
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
25
|
+
*/
|
|
26
|
+
export const decode = token => SignJWT.decode(token);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Verifies the JWS signature
|
|
30
|
+
*
|
|
31
|
+
* @example Usage with a public JWK encoded RSA key
|
|
32
|
+
*
|
|
33
|
+
* ```js
|
|
34
|
+
* const jwk = {
|
|
35
|
+
* crv: 'P-256',
|
|
36
|
+
* kty: 'EC',
|
|
37
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
38
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
39
|
+
* }
|
|
40
|
+
* const jwt =
|
|
41
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
42
|
+
*
|
|
43
|
+
* const isSignatureValid = await verify(jwt, jwk)
|
|
44
|
+
* ```
|
|
45
|
+
*
|
|
46
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
47
|
+
* @param key Public key to verify the JWT in JWK format.
|
|
48
|
+
*/
|
|
49
|
+
export const isSignatureValid = (token, jwk) => IoReactNativeJwt.verify(token, jwk);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Verifies the JWT format (to be a JWS Compact format), verifies the JWS signature, validates the
|
|
53
|
+
* JWT Claims Set.
|
|
54
|
+
*
|
|
55
|
+
* @example Usage with a public JWK encoded RSA key
|
|
56
|
+
*
|
|
57
|
+
* ```js
|
|
58
|
+
* const jwk = {
|
|
59
|
+
* crv: 'P-256',
|
|
60
|
+
* kty: 'EC',
|
|
61
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
62
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
63
|
+
* }
|
|
64
|
+
* const jwt =
|
|
65
|
+
* 'eyJ0eXAiOiJlbnRpdHktc3RhdGVtZW50K2p3dCIsImtpZCI6IkVDIzEiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0LyIsInN1YiI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvIiwibWV0YWRhdGEiOnsiZXVkaV93YWxsZXRfcHJvdmlkZXIiOnsiandrcyI6W3siY3J2IjoiUC0yNTYiLCJrdHkiOiJFQyIsIngiOiJxckpyajNBZl9CNTdzYk9JUnJjQk03YnI3d09jOHluajdsSEZQVGVmZlVrIiwieSI6IjFIMGNXRHlHZ3ZVOHcta1BLVV94eWNPQ1VOVDJvMGJ3c2xJUXRuUFU2aU0iLCJraWQiOiJFQyMxIn1dLCJ0b2tlbl9lbmRwb2ludCI6Imh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvdG9rZW4iLCJhc2NfdmFsdWVzX3N1cHBvcnRlZCI6WyJodHRwczovL2lvLWQtd2FsbGV0LWl0LmF6dXJld2Vic2l0ZXMubmV0L0xvQS9iYXNpYyIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL21lZGl1bSIsImh0dHBzOi8vaW8tZC13YWxsZXQtaXQuYXp1cmV3ZWJzaXRlcy5uZXQvTG9BL2hpZ2h0Il0sImdyYW50X3R5cGVzX3N1cHBvcnRlZCI6WyJ1cm46aWV0ZjpwYXJhbXM6b2F1dGg6Y2xpZW50LWFzc2VydGlvbi10eXBlOmp3dC1rZXktYXR0ZXN0YXRpb24iXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9tZXRob2RzX3N1cHBvcnRlZCI6WyJwcml2YXRlX2tleV9qd3QiXSwidG9rZW5fZW5kcG9pbnRfYXV0aF9zaWduaW5nX2FsZ192YWx1ZXNfc3VwcG9ydGVkIjpbIkVTMjU2IiwiRVMyNTZLIiwiRVMzODQiLCJFUzUxMiIsIlJTMjU2IiwiUlMzODQiLCJSUzUxMiIsIlBTMjU2IiwiUFMzODQiLCJQUzUxMiJdfSwiZmVkZXJhdGlvbl9lbnRpdHkiOnsib3JnYW5pemF0aW9uX25hbWUiOiJQYWdvUGEgUy5wLkEuIiwiaG9tZXBhZ2VfdXJpIjoiaHR0cHM6Ly9pby5pdGFsaWEuaXQvIiwicG9saWN5X3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L3ByaXZhY3ktcG9saWN5LyIsInRvc191cmkiOiJodHRwczovL2lvLml0YWxpYS5pdC9wcml2YWN5LXBvbGljeS8iLCJsb2dvX3VyaSI6Imh0dHBzOi8vaW8uaXRhbGlhLml0L2Fzc2V0cy9pbWcvaW8taXQtbG9nby13aGl0ZS5zdmcifX0sImlhdCI6MTY4OTIzNjYzNSwiZXhwIjoxNjg5MjQwMjM1fQ.6wA0M6rNYNSFN_EylzMA6ElAibW7FVSZyoLNEkHU5c_RKuiNenT08YIMvbysYautLZotUedEMP5xCyNpY34x6Q'
|
|
66
|
+
*
|
|
67
|
+
* const { payload, protectedHeader } = await verify(jwt, jwk, {
|
|
68
|
+
* typ: 'entity-statement+jwt',
|
|
69
|
+
* requiredClaims: ['iss', 'sub', 'metadata'],
|
|
70
|
+
* })
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @param jwt JSON Web Token value (encoded as JWS).
|
|
74
|
+
* @param key Public key to verify the JWT in JWK format.
|
|
75
|
+
* @param options JWT Decryption and JWT Claims Set validation options.
|
|
76
|
+
*/
|
|
77
|
+
export const verify = async function (token, jwk) {
|
|
78
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
79
|
+
const {
|
|
80
|
+
protectedHeader,
|
|
81
|
+
payload
|
|
82
|
+
} = await decode(token);
|
|
83
|
+
const signatureIsValid = await isSignatureValid(token, jwk);
|
|
84
|
+
if (signatureIsValid) {
|
|
85
|
+
const verifiedPayload = jwtPayload(protectedHeader, payload, options);
|
|
86
|
+
return {
|
|
87
|
+
payload: verifiedPayload,
|
|
88
|
+
protectedHeader
|
|
89
|
+
};
|
|
90
|
+
} else {
|
|
91
|
+
throw new JWSSignatureVerificationFailed();
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Calculate JWK thumbprint
|
|
97
|
+
*
|
|
98
|
+
* @example Get JWK thumbprint
|
|
99
|
+
*
|
|
100
|
+
* ```js
|
|
101
|
+
* const jwk: JWK = {
|
|
102
|
+
* crv: 'P-256',
|
|
103
|
+
* kty: 'EC',
|
|
104
|
+
* x: 'qrJrj3Af_B57sbOIRrcBM7br7wOc8ynj7lHFPTeffUk',
|
|
105
|
+
* y: '1H0cWDyGgvU8w-kPKU_xycOCUNT2o0bwslIQtnPU6iM',
|
|
106
|
+
* };
|
|
107
|
+
|
|
108
|
+
* const thumbprint = await thumbprint(jwk)
|
|
109
|
+
*
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @param jwk JSON Web Key
|
|
113
|
+
*/
|
|
114
|
+
export const thumbprint = jwk => IoReactNativeJwt.thumbprint(jwk);
|
|
115
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jwtPayload","JWSSignatureVerificationFailed","IoReactNativeJwt","SignJWT","derToJose","encodeBase64","decodeBase64","sha256ToBase64","decode","token","isSignatureValid","jwk","verify","options","arguments","length","undefined","protectedHeader","payload","signatureIsValid","verifiedPayload","thumbprint"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAKA,OAAOA,UAAU,MAAM,kBAAkB;AACzC,SAASC,8BAA8B,QAAQ,gBAAgB;AAC/D,SAASC,gBAAgB,QAAQ,eAAe;AAChD,SAASC,OAAO,QAAQ,QAAQ;AAEhC,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,aAAa;AAC3B,SAASC,SAAS,QAAQ,cAAc;AACxC,SAASC,YAAY,EAAEC,YAAY,QAAQ,gBAAgB;AAC3D,SAASC,cAAc,QAAQ,QAAQ;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,MAAM,GAAIC,KAAa,IAAsBN,OAAO,CAACK,MAAM,CAACC,KAAK,CAAC;;AAE/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAGA,CAACD,KAAa,EAAEE,GAAQ,KACtDT,gBAAgB,CAACU,MAAM,CAACH,KAAK,EAAEE,GAAG,CAAC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,MAAM,GAAG,eAAAA,CACpBH,KAAa,EACbE,GAAQ,EAEqB;EAAA,IAD7BE,OAAoC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAEzC,MAAM;IAAEG,eAAe;IAAEC;EAAQ,CAAC,GAAG,MAAMV,MAAM,CAACC,KAAK,CAAC;EACxD,MAAMU,gBAAgB,GAAG,MAAMT,gBAAgB,CAACD,KAAK,EAAEE,GAAG,CAAC;EAE3D,IAAIQ,gBAAgB,EAAE;IACpB,MAAMC,eAAe,GAAGpB,UAAU,CAACiB,eAAe,EAAEC,OAAO,EAAEL,OAAO,CAAC;IACrE,OAAO;MAAEK,OAAO,EAAEE,eAAe;MAAEH;IAAgB,CAAC;EACtD,CAAC,MAAM;IACL,MAAM,IAAIhB,8BAA8B,CAAC,CAAC;EAC5C;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMoB,UAAU,GAAIV,GAAQ,IACjCT,gBAAgB,CAACmB,UAAU,CAACV,GAAG,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This code comes from https://github.com/panva/jose
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { JWTClaimValidationFailed, JWTExpired } from './utils/errors';
|
|
6
|
+
import secs, { epoch } from './utils/secs';
|
|
7
|
+
const normalizeTyp = value => value.toLowerCase().replace(/^application\//, '');
|
|
8
|
+
const checkAudiencePresence = (audPayload, audOption) => {
|
|
9
|
+
if (typeof audPayload === 'string') {
|
|
10
|
+
return audOption.includes(audPayload);
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(audPayload)) {
|
|
13
|
+
/*
|
|
14
|
+
* Each principal intended to process the JWT MUST
|
|
15
|
+
* identify itself with a value in the audience claim
|
|
16
|
+
*/
|
|
17
|
+
return audOption.some(Set.prototype.has.bind(new Set(audPayload)));
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
};
|
|
21
|
+
export default (function (protectedHeader, payload) {
|
|
22
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
23
|
+
const {
|
|
24
|
+
typ
|
|
25
|
+
} = options;
|
|
26
|
+
if (typ && (typeof protectedHeader.typ !== 'string' || normalizeTyp(protectedHeader.typ) !== normalizeTyp(typ))) {
|
|
27
|
+
throw new JWTClaimValidationFailed('unexpected "typ" JWT header value', 'typ', 'check_failed');
|
|
28
|
+
}
|
|
29
|
+
const {
|
|
30
|
+
requiredClaims = [],
|
|
31
|
+
issuer,
|
|
32
|
+
subject,
|
|
33
|
+
audience,
|
|
34
|
+
maxTokenAge
|
|
35
|
+
} = options;
|
|
36
|
+
if (maxTokenAge !== undefined) requiredClaims.push('iat');
|
|
37
|
+
if (audience !== undefined) requiredClaims.push('aud');
|
|
38
|
+
if (subject !== undefined) requiredClaims.push('sub');
|
|
39
|
+
if (issuer !== undefined) requiredClaims.push('iss');
|
|
40
|
+
for (const claim of new Set(requiredClaims.reverse())) {
|
|
41
|
+
if (!(claim in payload)) {
|
|
42
|
+
throw new JWTClaimValidationFailed(`missing required "${claim}" claim`, claim, 'missing');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (issuer && !(Array.isArray(issuer) ? issuer : [issuer]).includes(payload.iss)) {
|
|
46
|
+
throw new JWTClaimValidationFailed('unexpected "iss" claim value', 'iss', 'check_failed');
|
|
47
|
+
}
|
|
48
|
+
if (subject && payload.sub !== subject) {
|
|
49
|
+
throw new JWTClaimValidationFailed('unexpected "sub" claim value', 'sub', 'check_failed');
|
|
50
|
+
}
|
|
51
|
+
if (audience && !checkAudiencePresence(payload.aud, typeof audience === 'string' ? [audience] : audience)) {
|
|
52
|
+
throw new JWTClaimValidationFailed('unexpected "aud" claim value', 'aud', 'check_failed');
|
|
53
|
+
}
|
|
54
|
+
let tolerance;
|
|
55
|
+
switch (typeof options.clockTolerance) {
|
|
56
|
+
case 'string':
|
|
57
|
+
tolerance = secs(options.clockTolerance);
|
|
58
|
+
break;
|
|
59
|
+
case 'number':
|
|
60
|
+
tolerance = options.clockTolerance;
|
|
61
|
+
break;
|
|
62
|
+
case 'undefined':
|
|
63
|
+
tolerance = 0;
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
throw new TypeError('Invalid clockTolerance option type');
|
|
67
|
+
}
|
|
68
|
+
const {
|
|
69
|
+
currentDate
|
|
70
|
+
} = options;
|
|
71
|
+
const now = epoch(currentDate || new Date());
|
|
72
|
+
if ((payload.iat !== undefined || maxTokenAge) && typeof payload.iat !== 'number') {
|
|
73
|
+
throw new JWTClaimValidationFailed('"iat" claim must be a number', 'iat', 'invalid');
|
|
74
|
+
}
|
|
75
|
+
if (payload.nbf !== undefined) {
|
|
76
|
+
if (typeof payload.nbf !== 'number') {
|
|
77
|
+
throw new JWTClaimValidationFailed('"nbf" claim must be a number', 'nbf', 'invalid');
|
|
78
|
+
}
|
|
79
|
+
if (payload.nbf > now + tolerance) {
|
|
80
|
+
throw new JWTClaimValidationFailed('"nbf" claim timestamp check failed', 'nbf', 'check_failed');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (payload.exp !== undefined) {
|
|
84
|
+
if (typeof payload.exp !== 'number') {
|
|
85
|
+
throw new JWTClaimValidationFailed('"exp" claim must be a number', 'exp', 'invalid');
|
|
86
|
+
}
|
|
87
|
+
if (payload.exp <= now - tolerance) {
|
|
88
|
+
throw new JWTExpired('"exp" claim timestamp check failed', 'exp', 'check_failed');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (maxTokenAge) {
|
|
92
|
+
const age = now - payload.iat;
|
|
93
|
+
const max = typeof maxTokenAge === 'number' ? maxTokenAge : secs(maxTokenAge);
|
|
94
|
+
if (age - tolerance > max) {
|
|
95
|
+
throw new JWTExpired('"iat" claim timestamp check failed (too far in the past)', 'iat', 'check_failed');
|
|
96
|
+
}
|
|
97
|
+
if (age < 0 - tolerance) {
|
|
98
|
+
throw new JWTClaimValidationFailed('"iat" claim timestamp check failed (it should be in the past)', 'iat', 'check_failed');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return payload;
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=jwt_claims_set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["JWTClaimValidationFailed","JWTExpired","secs","epoch","normalizeTyp","value","toLowerCase","replace","checkAudiencePresence","audPayload","audOption","includes","Array","isArray","some","Set","prototype","has","bind","protectedHeader","payload","options","arguments","length","undefined","typ","requiredClaims","issuer","subject","audience","maxTokenAge","push","claim","reverse","iss","sub","aud","tolerance","clockTolerance","TypeError","currentDate","now","Date","iat","nbf","exp","age","max"],"sourceRoot":"../../src","sources":["jwt_claims_set.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import isObject from './utils/is_object';
|
|
2
|
+
import secs, { epoch } from './utils/secs';
|
|
3
|
+
|
|
4
|
+
/** Generic class for JWT producing. */
|
|
5
|
+
export class ProduceJWT {
|
|
6
|
+
/** @param payload The JWT Claims Set object. */
|
|
7
|
+
constructor(payload) {
|
|
8
|
+
if (!isObject(payload)) {
|
|
9
|
+
throw new TypeError('JWT Claims Set MUST be an object');
|
|
10
|
+
}
|
|
11
|
+
this._payload = payload;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Set "iss" (Issuer) Claim.
|
|
16
|
+
*
|
|
17
|
+
* @param issuer "Issuer" Claim value to set on the JWT Claims Set.
|
|
18
|
+
*/
|
|
19
|
+
setIssuer(issuer) {
|
|
20
|
+
this._payload = {
|
|
21
|
+
...this._payload,
|
|
22
|
+
iss: issuer
|
|
23
|
+
};
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Set "sub" (Subject) Claim.
|
|
29
|
+
*
|
|
30
|
+
* @param subject "sub" (Subject) Claim value to set on the JWT Claims Set.
|
|
31
|
+
*/
|
|
32
|
+
setSubject(subject) {
|
|
33
|
+
this._payload = {
|
|
34
|
+
...this._payload,
|
|
35
|
+
sub: subject
|
|
36
|
+
};
|
|
37
|
+
return this;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Set "aud" (Audience) Claim.
|
|
42
|
+
*
|
|
43
|
+
* @param audience "aud" (Audience) Claim value to set on the JWT Claims Set.
|
|
44
|
+
*/
|
|
45
|
+
setAudience(audience) {
|
|
46
|
+
this._payload = {
|
|
47
|
+
...this._payload,
|
|
48
|
+
aud: audience
|
|
49
|
+
};
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Set "jti" (JWT ID) Claim.
|
|
55
|
+
*
|
|
56
|
+
* @param jwtId "jti" (JWT ID) Claim value to set on the JWT Claims Set.
|
|
57
|
+
*/
|
|
58
|
+
setJti(jwtId) {
|
|
59
|
+
this._payload = {
|
|
60
|
+
...this._payload,
|
|
61
|
+
jti: jwtId
|
|
62
|
+
};
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Set "nbf" (Not Before) Claim.
|
|
68
|
+
*
|
|
69
|
+
* @param input "nbf" (Not Before) Claim value to set on the JWT Claims Set. When number is passed
|
|
70
|
+
* that is used as a value, when string is passed it is resolved to a time span and added to the
|
|
71
|
+
* current timestamp.
|
|
72
|
+
*/
|
|
73
|
+
setNotBefore(input) {
|
|
74
|
+
if (typeof input === 'number') {
|
|
75
|
+
this._payload = {
|
|
76
|
+
...this._payload,
|
|
77
|
+
nbf: input
|
|
78
|
+
};
|
|
79
|
+
} else {
|
|
80
|
+
this._payload = {
|
|
81
|
+
...this._payload,
|
|
82
|
+
nbf: epoch(new Date()) + secs(input)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Set "exp" (Expiration Time) Claim.
|
|
90
|
+
*
|
|
91
|
+
* @param input "exp" (Expiration Time) Claim value to set on the JWT Claims Set. When number is
|
|
92
|
+
* passed that is used as a value, when string is passed it is resolved to a time span and added
|
|
93
|
+
* to the current timestamp.
|
|
94
|
+
*/
|
|
95
|
+
setExpirationTime(input) {
|
|
96
|
+
if (typeof input === 'number') {
|
|
97
|
+
this._payload = {
|
|
98
|
+
...this._payload,
|
|
99
|
+
exp: input
|
|
100
|
+
};
|
|
101
|
+
} else {
|
|
102
|
+
this._payload = {
|
|
103
|
+
...this._payload,
|
|
104
|
+
exp: epoch(new Date()) + secs(input)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Set "iat" (Issued At) Claim.
|
|
112
|
+
*
|
|
113
|
+
* @param input "iat" (Issued At) Claim value to set on the JWT Claims Set. Default is current
|
|
114
|
+
* timestamp.
|
|
115
|
+
*/
|
|
116
|
+
setIssuedAt(input) {
|
|
117
|
+
if (typeof input === 'undefined') {
|
|
118
|
+
this._payload = {
|
|
119
|
+
...this._payload,
|
|
120
|
+
iat: epoch(new Date())
|
|
121
|
+
};
|
|
122
|
+
} else {
|
|
123
|
+
this._payload = {
|
|
124
|
+
...this._payload,
|
|
125
|
+
iat: input
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return this;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=produce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isObject","secs","epoch","ProduceJWT","constructor","payload","TypeError","_payload","setIssuer","issuer","iss","setSubject","subject","sub","setAudience","audience","aud","setJti","jwtId","jti","setNotBefore","input","nbf","Date","setExpirationTime","exp","setIssuedAt","iat"],"sourceRoot":"../../src","sources":["produce.ts"],"mappings":"AACA,OAAOA,QAAQ,MAAM,mBAAmB;AACxC,OAAOC,IAAI,IAAIC,KAAK,QAAQ,cAAc;;AAE1C;AACA,OAAO,MAAMC,UAAU,CAAC;EAGtB;EACAC,WAAWA,CAACC,OAAmB,EAAE;IAC/B,IAAI,CAACL,QAAQ,CAACK,OAAO,CAAC,EAAE;MACtB,MAAM,IAAIC,SAAS,CAAC,kCAAkC,CAAC;IACzD;IACA,IAAI,CAACC,QAAQ,GAAGF,OAAO;EACzB;;EAEA;AACF;AACA;AACA;AACA;EACEG,SAASA,CAACC,MAAc,EAAE;IACxB,IAAI,CAACF,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEG,GAAG,EAAED;IAAO,CAAC;IACjD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,UAAUA,CAACC,OAAe,EAAE;IAC1B,IAAI,CAACL,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEM,GAAG,EAAED;IAAQ,CAAC;IAClD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,WAAWA,CAACC,QAA2B,EAAE;IACvC,IAAI,CAACR,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAES,GAAG,EAAED;IAAS,CAAC;IACnD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;EACEE,MAAMA,CAACC,KAAa,EAAE;IACpB,IAAI,CAACX,QAAQ,GAAG;MAAE,GAAG,IAAI,CAACA,QAAQ;MAAEY,GAAG,EAAED;IAAM,CAAC;IAChD,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEE,YAAYA,CAACC,KAAsB,EAAE;IACnC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEe,GAAG,EAAED;MAAM,CAAC;IAClD,CAAC,MAAM;MACL,IAAI,CAACd,QAAQ,GAAG;QACd,GAAG,IAAI,CAACA,QAAQ;QAChBe,GAAG,EAAEpB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC,CAAC,GAAGtB,IAAI,CAACoB,KAAK;MACrC,CAAC;IACH;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,iBAAiBA,CAACH,KAAsB,EAAE;IACxC,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEkB,GAAG,EAAEJ;MAAM,CAAC;IAClD,CAAC,MAAM;MACL,IAAI,CAACd,QAAQ,GAAG;QACd,GAAG,IAAI,CAACA,QAAQ;QAChBkB,GAAG,EAAEvB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC,CAAC,GAAGtB,IAAI,CAACoB,KAAK;MACrC,CAAC;IACH;IACA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEK,WAAWA,CAACL,KAAc,EAAE;IAC1B,IAAI,OAAOA,KAAK,KAAK,WAAW,EAAE;MAChC,IAAI,CAACd,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEoB,GAAG,EAAEzB,KAAK,CAAC,IAAIqB,IAAI,CAAC,CAAC;MAAE,CAAC;IAC9D,CAAC,MAAM;MACL,IAAI,CAAChB,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEoB,GAAG,EAAEN;MAAM,CAAC;IAClD;IACA,OAAO,IAAI;EACb;AACF"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { JOSENotSupported, JWSInvalid, JWTInvalid } from './utils/errors';
|
|
2
|
+
import { ProduceJWT } from './produce';
|
|
3
|
+
import { decodeBase64, encodeBase64, removePadding } from './utils/base64';
|
|
4
|
+
import { isAlgSupported } from './algorithms';
|
|
5
|
+
import { derToJose } from './utils/asn1';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The SignJWT class is used to build and sign Compact JWS formatted JSON Web Tokens.
|
|
9
|
+
*
|
|
10
|
+
* @example Usage with a given signature
|
|
11
|
+
*
|
|
12
|
+
* ```js
|
|
13
|
+
* const alg = 'RS256'
|
|
14
|
+
* const signature = 'Axy0....'
|
|
15
|
+
*
|
|
16
|
+
* const jwt = new SignJWT({ 'urn:example:claim': true })
|
|
17
|
+
* .setProtectedHeader({ alg })
|
|
18
|
+
* .setIssuedAt()
|
|
19
|
+
* .setIssuer('urn:example:issuer')
|
|
20
|
+
* .setAudience('urn:example:audience')
|
|
21
|
+
* .setExpirationTime('2h')
|
|
22
|
+
* .sign(signature)
|
|
23
|
+
*
|
|
24
|
+
* console.log(jwt)
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class SignJWT extends ProduceJWT {
|
|
28
|
+
/**
|
|
29
|
+
* Sets the JWS Protected Header on the SignJWT object.
|
|
30
|
+
*
|
|
31
|
+
* @param protectedHeader JWS Protected Header. Must contain an "alg" (JWS Algorithm) property.
|
|
32
|
+
*/
|
|
33
|
+
setProtectedHeader(protectedHeader) {
|
|
34
|
+
if (protectedHeader.alg && isAlgSupported(protectedHeader.alg)) {
|
|
35
|
+
this._protectedHeader = protectedHeader;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
throw new JOSENotSupported('Unsupported "alg" value');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Return a JWT without signature (`header.payload`) to sign.
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
toSign() {
|
|
46
|
+
if (!this._protectedHeader || !this._protectedHeader.alg) {
|
|
47
|
+
throw new JWSInvalid('Missing signature algorithm. Specify the `alg` field');
|
|
48
|
+
}
|
|
49
|
+
const protectedHeader = encodeBase64(JSON.stringify(this._protectedHeader));
|
|
50
|
+
const payload = encodeBase64(JSON.stringify(this._payload));
|
|
51
|
+
if (payload && protectedHeader) {
|
|
52
|
+
return `${protectedHeader}.${payload}`;
|
|
53
|
+
} else {
|
|
54
|
+
throw new JWSInvalid();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Append signature to unsigned JWT.
|
|
60
|
+
* For an ECDSA signature it is required that this is in ASN.1/DER encoded format.
|
|
61
|
+
* The same format used by the TEE. Conversion to JWS is handled automatically.
|
|
62
|
+
*
|
|
63
|
+
* @param jwtWithoutSignature
|
|
64
|
+
* @param signature
|
|
65
|
+
*/
|
|
66
|
+
static async appendSignature(jwtWithoutSignature, signature) {
|
|
67
|
+
if (typeof jwtWithoutSignature !== 'string' || typeof signature !== 'string') {
|
|
68
|
+
throw new JWTInvalid('JWS must be a string');
|
|
69
|
+
}
|
|
70
|
+
if (signature === '') throw new JWSInvalid('Invalid signature');
|
|
71
|
+
const jwtDecoded = SignJWT.decodeJwtWithoutSignature(jwtWithoutSignature);
|
|
72
|
+
const alg = jwtDecoded.header.alg;
|
|
73
|
+
try {
|
|
74
|
+
const encodedJws = await derToJose(signature, alg);
|
|
75
|
+
return `${jwtWithoutSignature}.${encodedJws}`;
|
|
76
|
+
} catch {
|
|
77
|
+
const encodedJws = removePadding(signature);
|
|
78
|
+
return `${jwtWithoutSignature}.${encodedJws}`;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Decodes a JWT without signature
|
|
84
|
+
*
|
|
85
|
+
* @param jwtWithoutSignature JWT to sign that needs to be decoded.
|
|
86
|
+
*/
|
|
87
|
+
static decodeJwtWithoutSignature(jwtWithoutSignature) {
|
|
88
|
+
if (typeof jwtWithoutSignature !== 'string') {
|
|
89
|
+
throw new JWTInvalid('JWT must be a string');
|
|
90
|
+
}
|
|
91
|
+
const {
|
|
92
|
+
0: encodedHeader,
|
|
93
|
+
1: encodedPayload,
|
|
94
|
+
length
|
|
95
|
+
} = jwtWithoutSignature.split('.');
|
|
96
|
+
let header;
|
|
97
|
+
try {
|
|
98
|
+
let decoded = decodeBase64(encodedHeader);
|
|
99
|
+
header = JSON.parse(decoded);
|
|
100
|
+
if (!header.alg || !isAlgSupported(header.alg)) {
|
|
101
|
+
throw new JOSENotSupported('Unsupported "alg" value');
|
|
102
|
+
}
|
|
103
|
+
} catch {
|
|
104
|
+
throw new JWTInvalid('Unable to decode JWT header');
|
|
105
|
+
}
|
|
106
|
+
if (length !== 2 || encodedPayload === '') {
|
|
107
|
+
throw new JWTInvalid('Invalid JWT to sign');
|
|
108
|
+
}
|
|
109
|
+
let decodedPayload = decodeBase64(encodedPayload);
|
|
110
|
+
const payload = JSON.parse(decodedPayload);
|
|
111
|
+
return {
|
|
112
|
+
payload,
|
|
113
|
+
header
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Decodes a JWT without signature
|
|
119
|
+
*
|
|
120
|
+
* @param jwtWithoutSignature JWT to sign that needs to be decoded.
|
|
121
|
+
*/
|
|
122
|
+
static decode(jwt) {
|
|
123
|
+
if (typeof jwt !== 'string') {
|
|
124
|
+
throw new JWTInvalid('JWT must be a string');
|
|
125
|
+
}
|
|
126
|
+
const {
|
|
127
|
+
0: encodedHeader,
|
|
128
|
+
1: encodedPayload,
|
|
129
|
+
2: signature,
|
|
130
|
+
length
|
|
131
|
+
} = jwt.split('.');
|
|
132
|
+
let protectedHeader;
|
|
133
|
+
try {
|
|
134
|
+
let decoded = decodeBase64(encodedHeader);
|
|
135
|
+
protectedHeader = JSON.parse(decoded);
|
|
136
|
+
if (!protectedHeader.alg || !isAlgSupported(protectedHeader.alg)) {
|
|
137
|
+
throw new JOSENotSupported('Unsupported "alg" value');
|
|
138
|
+
}
|
|
139
|
+
} catch {
|
|
140
|
+
throw new JWTInvalid('Unable to decode JWT header');
|
|
141
|
+
}
|
|
142
|
+
if (length !== 3 || encodedPayload === '' || signature === '') {
|
|
143
|
+
throw new JWTInvalid('Invalid JWT');
|
|
144
|
+
}
|
|
145
|
+
let decodedPayload = decodeBase64(encodedPayload);
|
|
146
|
+
const payload = JSON.parse(decodedPayload);
|
|
147
|
+
return {
|
|
148
|
+
payload,
|
|
149
|
+
protectedHeader
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["JOSENotSupported","JWSInvalid","JWTInvalid","ProduceJWT","decodeBase64","encodeBase64","removePadding","isAlgSupported","derToJose","SignJWT","setProtectedHeader","protectedHeader","alg","_protectedHeader","toSign","JSON","stringify","payload","_payload","appendSignature","jwtWithoutSignature","signature","jwtDecoded","decodeJwtWithoutSignature","header","encodedJws","encodedHeader","encodedPayload","length","split","decoded","parse","decodedPayload","decode","jwt"],"sourceRoot":"../../src","sources":["sign.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":""}
|