@boxyhq/saml-jackson 0.2.3-beta.235 → 0.2.3-beta.240

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.
Files changed (53) hide show
  1. package/dist/controller/api.d.ts +32 -0
  2. package/dist/controller/api.js +193 -0
  3. package/dist/controller/error.d.ts +5 -0
  4. package/dist/controller/error.js +12 -0
  5. package/dist/controller/oauth/allowed.d.ts +1 -0
  6. package/dist/controller/oauth/allowed.js +17 -0
  7. package/dist/controller/oauth/code-verifier.d.ts +2 -0
  8. package/dist/controller/oauth/code-verifier.js +15 -0
  9. package/dist/controller/oauth/redirect.d.ts +1 -0
  10. package/dist/controller/oauth/redirect.js +11 -0
  11. package/dist/controller/oauth.d.ts +23 -0
  12. package/dist/controller/oauth.js +263 -0
  13. package/dist/controller/utils.d.ts +6 -0
  14. package/dist/controller/utils.js +17 -0
  15. package/dist/db/db.d.ts +15 -0
  16. package/dist/db/db.js +107 -0
  17. package/dist/db/encrypter.d.ts +3 -0
  18. package/dist/db/encrypter.js +29 -0
  19. package/dist/db/mem.d.ts +20 -0
  20. package/dist/db/mem.js +128 -0
  21. package/dist/db/mongo.d.ts +17 -0
  22. package/dist/db/mongo.js +106 -0
  23. package/dist/db/redis.d.ts +15 -0
  24. package/dist/db/redis.js +107 -0
  25. package/dist/db/sql/entity/JacksonIndex.d.ts +7 -0
  26. package/dist/db/sql/entity/JacksonIndex.js +41 -0
  27. package/dist/db/sql/entity/JacksonStore.d.ts +6 -0
  28. package/dist/db/sql/entity/JacksonStore.js +42 -0
  29. package/dist/db/sql/entity/JacksonTTL.d.ts +4 -0
  30. package/dist/db/sql/entity/JacksonTTL.js +29 -0
  31. package/dist/db/sql/sql.d.ts +20 -0
  32. package/dist/db/sql/sql.js +174 -0
  33. package/dist/db/store.d.ts +5 -0
  34. package/dist/db/store.js +68 -0
  35. package/dist/db/utils.d.ts +7 -0
  36. package/dist/db/utils.js +29 -0
  37. package/dist/env.d.ts +22 -0
  38. package/dist/env.js +35 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.js +80 -0
  41. package/dist/jackson.d.ts +1 -0
  42. package/dist/jackson.js +153 -0
  43. package/dist/read-config.d.ts +3 -0
  44. package/dist/read-config.js +50 -0
  45. package/dist/saml/claims.d.ts +6 -0
  46. package/dist/saml/claims.js +35 -0
  47. package/dist/saml/saml.d.ts +11 -0
  48. package/dist/saml/saml.js +200 -0
  49. package/dist/saml/x509.d.ts +7 -0
  50. package/dist/saml/x509.js +69 -0
  51. package/dist/typings.d.ts +137 -0
  52. package/dist/typings.js +2 -0
  53. package/package.json +2 -1
@@ -0,0 +1,6 @@
1
+ declare const _default: {
2
+ map: (claims: Record<"id" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" | "email" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" | "firstName" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" | "lastName" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", unknown>) => {
3
+ raw: Record<"id" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier" | "email" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" | "firstName" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname" | "lastName" | "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname", unknown>;
4
+ };
5
+ };
6
+ export default _default;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mapping = [
4
+ {
5
+ attribute: 'id',
6
+ schema: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier',
7
+ },
8
+ {
9
+ attribute: 'email',
10
+ schema: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress',
11
+ },
12
+ {
13
+ attribute: 'firstName',
14
+ schema: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname',
15
+ },
16
+ {
17
+ attribute: 'lastName',
18
+ schema: 'http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname',
19
+ },
20
+ ];
21
+ const map = (claims) => {
22
+ const profile = {
23
+ raw: claims,
24
+ };
25
+ mapping.forEach((m) => {
26
+ if (claims[m.attribute]) {
27
+ profile[m.attribute] = claims[m.attribute];
28
+ }
29
+ else if (claims[m.schema]) {
30
+ profile[m.attribute] = claims[m.schema];
31
+ }
32
+ });
33
+ return profile;
34
+ };
35
+ exports.default = { map };
@@ -0,0 +1,11 @@
1
+ import { SAMLProfile, SAMLReq } from '../typings';
2
+ declare const _default: {
3
+ request: ({ ssoUrl, entityID, callbackUrl, isPassive, forceAuthn, identifierFormat, providerName, signingKey, }: SAMLReq) => {
4
+ id: string;
5
+ request: string;
6
+ };
7
+ parseAsync: (rawAssertion: string) => Promise<SAMLProfile>;
8
+ validateAsync: (rawAssertion: string, options: any) => Promise<SAMLProfile>;
9
+ parseMetadataAsync: (idpMeta: string) => Promise<Record<string, any>>;
10
+ };
11
+ export default _default;
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ const saml20_1 = __importDefault(require("@boxyhq/saml20"));
35
+ const xml2js_1 = __importDefault(require("xml2js"));
36
+ const thumbprint_1 = __importDefault(require("thumbprint"));
37
+ const xml_crypto_1 = __importDefault(require("xml-crypto"));
38
+ const rambda = __importStar(require("rambda"));
39
+ const xmlbuilder_1 = __importDefault(require("xmlbuilder"));
40
+ const crypto_1 = __importDefault(require("crypto"));
41
+ const claims_1 = __importDefault(require("./claims"));
42
+ const idPrefix = '_';
43
+ const authnXPath = '/*[local-name(.)="AuthnRequest" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:protocol"]';
44
+ const issuerXPath = '/*[local-name(.)="Issuer" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:assertion"]';
45
+ const signRequest = (xml, signingKey) => {
46
+ if (!xml) {
47
+ throw new Error('Please specify xml');
48
+ }
49
+ if (!signingKey) {
50
+ throw new Error('Please specify signingKey');
51
+ }
52
+ const sig = new xml_crypto_1.default.SignedXml();
53
+ sig.signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256';
54
+ sig.signingKey = signingKey;
55
+ sig.addReference(authnXPath, [
56
+ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature',
57
+ 'http://www.w3.org/2001/10/xml-exc-c14n#',
58
+ ], 'http://www.w3.org/2001/04/xmlenc#sha256');
59
+ sig.computeSignature(xml, {
60
+ location: { reference: authnXPath + issuerXPath, action: 'after' },
61
+ });
62
+ return sig.getSignedXml();
63
+ };
64
+ const request = ({ ssoUrl, entityID, callbackUrl, isPassive = false, forceAuthn = false, identifierFormat = 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress', providerName = 'BoxyHQ', signingKey, }) => {
65
+ const id = idPrefix + crypto_1.default.randomBytes(10).toString('hex');
66
+ const date = new Date().toISOString();
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const samlReq = {
69
+ 'samlp:AuthnRequest': {
70
+ '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol',
71
+ '@ID': id,
72
+ '@Version': '2.0',
73
+ '@IssueInstant': date,
74
+ '@ProtocolBinding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
75
+ '@Destination': ssoUrl,
76
+ 'saml:Issuer': {
77
+ '@xmlns:saml': 'urn:oasis:names:tc:SAML:2.0:assertion',
78
+ '#text': entityID,
79
+ },
80
+ },
81
+ };
82
+ if (isPassive)
83
+ samlReq['samlp:AuthnRequest']['@IsPassive'] = true;
84
+ if (forceAuthn) {
85
+ samlReq['samlp:AuthnRequest']['@ForceAuthn'] = true;
86
+ }
87
+ samlReq['samlp:AuthnRequest']['@AssertionConsumerServiceURL'] = callbackUrl;
88
+ samlReq['samlp:AuthnRequest']['samlp:NameIDPolicy'] = {
89
+ '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol',
90
+ '@Format': identifierFormat,
91
+ '@AllowCreate': 'true',
92
+ };
93
+ if (providerName != null) {
94
+ samlReq['samlp:AuthnRequest']['@ProviderName'] = providerName;
95
+ }
96
+ let xml = xmlbuilder_1.default.create(samlReq).end({});
97
+ if (signingKey) {
98
+ xml = signRequest(xml, signingKey);
99
+ }
100
+ return {
101
+ id,
102
+ request: xml,
103
+ };
104
+ };
105
+ const parseAsync = (rawAssertion) => __awaiter(void 0, void 0, void 0, function* () {
106
+ return new Promise((resolve, reject) => {
107
+ saml20_1.default.parse(rawAssertion, function onParseAsync(err, profile) {
108
+ if (err) {
109
+ reject(err);
110
+ return;
111
+ }
112
+ resolve(profile);
113
+ });
114
+ });
115
+ });
116
+ const validateAsync = (rawAssertion, options) => __awaiter(void 0, void 0, void 0, function* () {
117
+ return new Promise((resolve, reject) => {
118
+ saml20_1.default.validate(rawAssertion, options, function onValidateAsync(err, profile) {
119
+ if (err) {
120
+ reject(err);
121
+ return;
122
+ }
123
+ if (profile && profile.claims) {
124
+ // we map claims to our attributes id, email, firstName, lastName where possible. We also map original claims to raw
125
+ profile.claims = claims_1.default.map(profile.claims);
126
+ // some providers don't return the id in the assertion, we set it to a sha256 hash of the email
127
+ if (!profile.claims.id) {
128
+ profile.claims.id = crypto_1.default
129
+ .createHash('sha256')
130
+ .update(profile.claims.email)
131
+ .digest('hex');
132
+ }
133
+ }
134
+ resolve(profile);
135
+ });
136
+ });
137
+ });
138
+ const parseMetadataAsync = (idpMeta) => __awaiter(void 0, void 0, void 0, function* () {
139
+ return new Promise((resolve, reject) => {
140
+ xml2js_1.default.parseString(idpMeta, { tagNameProcessors: [xml2js_1.default.processors.stripPrefix] }, (err, res) => {
141
+ if (err) {
142
+ reject(err);
143
+ return;
144
+ }
145
+ const entityID = rambda.path('EntityDescriptor.$.entityID', res);
146
+ let X509Certificate = null;
147
+ let ssoPostUrl = null;
148
+ let ssoRedirectUrl = null;
149
+ let loginType = 'idp';
150
+ let ssoDes = rambda.pathOr(null, 'EntityDescriptor.IDPSSODescriptor', res);
151
+ if (!ssoDes) {
152
+ ssoDes = rambda.pathOr([], 'EntityDescriptor.SPSSODescriptor', res);
153
+ if (!ssoDes) {
154
+ loginType = 'sp';
155
+ }
156
+ }
157
+ for (const ssoDesRec of ssoDes) {
158
+ const keyDes = ssoDesRec['KeyDescriptor'];
159
+ for (const keyDesRec of keyDes) {
160
+ if (keyDesRec['$'] && keyDesRec['$'].use === 'signing') {
161
+ const ki = keyDesRec['KeyInfo'][0];
162
+ const cd = ki['X509Data'][0];
163
+ X509Certificate = cd['X509Certificate'][0];
164
+ }
165
+ }
166
+ const ssoSvc = ssoDesRec['SingleSignOnService'] ||
167
+ ssoDesRec['AssertionConsumerService'] ||
168
+ [];
169
+ for (const ssoSvcRec of ssoSvc) {
170
+ if (rambda.pathOr('', '$.Binding', ssoSvcRec).endsWith('HTTP-POST')) {
171
+ ssoPostUrl = rambda.path('$.Location', ssoSvcRec);
172
+ }
173
+ else if (rambda
174
+ .pathOr('', '$.Binding', ssoSvcRec)
175
+ .endsWith('HTTP-Redirect')) {
176
+ ssoRedirectUrl = rambda.path('$.Location', ssoSvcRec);
177
+ }
178
+ }
179
+ }
180
+ const ret = {
181
+ sso: {},
182
+ };
183
+ if (entityID) {
184
+ ret.entityID = entityID;
185
+ }
186
+ if (X509Certificate) {
187
+ ret.thumbprint = thumbprint_1.default.calculate(X509Certificate);
188
+ }
189
+ if (ssoPostUrl) {
190
+ ret.sso.postUrl = ssoPostUrl;
191
+ }
192
+ if (ssoRedirectUrl) {
193
+ ret.sso.redirectUrl = ssoRedirectUrl;
194
+ }
195
+ ret.loginType = loginType;
196
+ resolve(ret);
197
+ });
198
+ });
199
+ });
200
+ exports.default = { request, parseAsync, validateAsync, parseMetadataAsync };
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ generate: () => Promise<{
3
+ publicKey: string;
4
+ privateKey: string;
5
+ } | undefined>;
6
+ };
7
+ export default _default;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ const x509 = __importStar(require("@peculiar/x509"));
32
+ const webcrypto_1 = require("@peculiar/webcrypto");
33
+ const crypto = new webcrypto_1.Crypto();
34
+ x509.cryptoProvider.set(crypto);
35
+ const alg = {
36
+ name: 'RSASSA-PKCS1-v1_5',
37
+ hash: 'SHA-256',
38
+ publicExponent: new Uint8Array([1, 0, 1]),
39
+ modulusLength: 2048,
40
+ };
41
+ const generate = () => __awaiter(void 0, void 0, void 0, function* () {
42
+ const keys = yield crypto.subtle.generateKey(alg, true, ['sign', 'verify']);
43
+ const extensions = [
44
+ new x509.BasicConstraintsExtension(false, undefined, true),
45
+ ];
46
+ extensions.push(new x509.KeyUsagesExtension(x509.KeyUsageFlags.digitalSignature, true));
47
+ if (keys.publicKey) {
48
+ extensions.push(yield x509.SubjectKeyIdentifierExtension.create(keys.publicKey));
49
+ }
50
+ const cert = yield x509.X509CertificateGenerator.createSelfSigned({
51
+ serialNumber: '01',
52
+ name: 'CN=BoxyHQ Jackson',
53
+ notBefore: new Date(),
54
+ notAfter: new Date('3021/01/01'),
55
+ signingAlgorithm: alg,
56
+ keys: keys,
57
+ extensions,
58
+ });
59
+ if (keys.privateKey) {
60
+ const pkcs8 = yield crypto.subtle.exportKey('pkcs8', keys.privateKey);
61
+ return {
62
+ publicKey: cert.toString('pem'),
63
+ privateKey: x509.PemConverter.encode(pkcs8, 'private key'),
64
+ };
65
+ }
66
+ });
67
+ exports.default = {
68
+ generate,
69
+ };
@@ -0,0 +1,137 @@
1
+ export declare type IdPConfig = {
2
+ defaultRedirectUrl: string;
3
+ redirectUrl: string;
4
+ tenant: string;
5
+ product: string;
6
+ rawMetadata: string;
7
+ };
8
+ export interface OAuth {
9
+ client_id: string;
10
+ client_secret: string;
11
+ provider: string;
12
+ }
13
+ export interface ISAMLConfig {
14
+ config(body: IdPConfig): Promise<OAuth>;
15
+ getConfig(body: {
16
+ clientID: string;
17
+ tenant: string;
18
+ product: string;
19
+ }): Promise<Partial<OAuth>>;
20
+ deleteConfig(body: {
21
+ clientID: string;
22
+ clientSecret: string;
23
+ tenant: string;
24
+ product: string;
25
+ }): Promise<void>;
26
+ create(body: IdPConfig): Promise<OAuth>;
27
+ get(body: {
28
+ clientID: string;
29
+ tenant: string;
30
+ product: string;
31
+ }): Promise<Partial<OAuth>>;
32
+ delete(body: {
33
+ clientID: string;
34
+ clientSecret: string;
35
+ tenant: string;
36
+ product: string;
37
+ }): Promise<void>;
38
+ }
39
+ export interface IOAuthController {
40
+ authorize(body: OAuthReqBody): Promise<{
41
+ redirect_url: string;
42
+ }>;
43
+ samlResponse(body: SAMLResponsePayload): Promise<{
44
+ redirect_url: string;
45
+ }>;
46
+ token(body: OAuthTokenReq): Promise<OAuthTokenRes>;
47
+ userInfo(token: string): Promise<Profile>;
48
+ }
49
+ export interface OAuthReqBody {
50
+ response_type: 'code';
51
+ client_id: string;
52
+ redirect_uri: string;
53
+ state: string;
54
+ tenant: string;
55
+ product: string;
56
+ code_challenge: string;
57
+ code_challenge_method: 'plain' | 'S256' | '';
58
+ provider: 'saml';
59
+ }
60
+ export interface SAMLResponsePayload {
61
+ SAMLResponse: string;
62
+ RelayState: string;
63
+ }
64
+ export interface OAuthTokenReq {
65
+ client_id: string;
66
+ client_secret: string;
67
+ code_verifier: string;
68
+ code: string;
69
+ grant_type: 'authorization_code';
70
+ }
71
+ export interface OAuthTokenRes {
72
+ access_token: string;
73
+ token_type: 'bearer';
74
+ expires_in: number;
75
+ }
76
+ export interface Profile {
77
+ id: string;
78
+ email: string;
79
+ firstName: string;
80
+ lastName: string;
81
+ }
82
+ export interface Index {
83
+ name: string;
84
+ value: string;
85
+ }
86
+ export interface DatabaseDriver {
87
+ get(namespace: string, key: string): Promise<any>;
88
+ put(namespace: string, key: string, val: any, ttl: number, ...indexes: Index[]): Promise<any>;
89
+ delete(namespace: string, key: string): Promise<any>;
90
+ getByIndex(namespace: string, idx: Index): Promise<any>;
91
+ }
92
+ export interface Storable {
93
+ get(key: string): Promise<any>;
94
+ put(key: string, val: any, ...indexes: Index[]): Promise<any>;
95
+ delete(key: string): Promise<any>;
96
+ getByIndex(idx: Index): Promise<any>;
97
+ }
98
+ export interface Encrypted {
99
+ iv?: string;
100
+ tag?: string;
101
+ value: string;
102
+ }
103
+ export declare type EncryptionKey = any;
104
+ export declare type DatabaseEngine = 'redis' | 'sql' | 'mongo' | 'mem';
105
+ export declare type DatabaseType = 'postgres' | 'mysql' | 'mariadb';
106
+ export interface DatabaseOption {
107
+ engine: DatabaseEngine;
108
+ url: string;
109
+ type: DatabaseType;
110
+ ttl: number;
111
+ cleanupLimit: number;
112
+ encryptionKey: string;
113
+ }
114
+ export interface SAMLReq {
115
+ ssoUrl?: string;
116
+ entityID: string;
117
+ callbackUrl: string;
118
+ isPassive?: boolean;
119
+ forceAuthn?: boolean;
120
+ identifierFormat?: 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress';
121
+ providerName?: 'BoxyHQ';
122
+ signingKey: string;
123
+ }
124
+ export interface SAMLProfile {
125
+ audience: string;
126
+ claims: Record<string, any>;
127
+ issuer: string;
128
+ sessionIndex: string;
129
+ }
130
+ export interface JacksonOption {
131
+ externalUrl: string;
132
+ samlPath: string;
133
+ samlAudience: string;
134
+ preLoadedConfig?: string;
135
+ idpEnabled?: boolean;
136
+ db: DatabaseOption;
137
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boxyhq/saml-jackson",
3
- "version": "0.2.3-beta.235",
3
+ "version": "0.2.3-beta.240",
4
4
  "license": "Apache 2.0",
5
5
  "description": "SAML 2.0 service",
6
6
  "main": "dist/index.js",
@@ -17,6 +17,7 @@
17
17
  ],
18
18
  "scripts": {
19
19
  "build": "tsc -p tsconfig.build.json",
20
+ "prepublish": "npm run build",
20
21
  "start": "cross-env IDP_ENABLED=true node dist/jackson.js",
21
22
  "dev": "cross-env IDP_ENABLED=true nodemon --config nodemon.json src/jackson.ts",
22
23
  "mongo": "cross-env JACKSON_API_KEYS=secret DB_ENGINE=mongo DB_URL=mongodb://localhost:27017/jackson nodemon --config nodemon.json src/jackson.ts",