exodus-framework 2.2.103 → 2.2.105
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { JWK } from 'node-jose';
|
|
2
2
|
import { Service } from '../app/index.js';
|
|
3
3
|
import { TSignData } from '../contracts/security.js';
|
|
4
4
|
declare class SecurityService extends Service {
|
|
@@ -14,53 +14,53 @@ declare class SecurityService extends Service {
|
|
|
14
14
|
privateKey: string;
|
|
15
15
|
}>;
|
|
16
16
|
loadServicePublicKey(): Promise<void>;
|
|
17
|
-
loadKeyByStr(data: string): Promise<
|
|
17
|
+
loadKeyByStr(data: string): Promise<JWK.Key>;
|
|
18
18
|
/**
|
|
19
19
|
* Chave privada emitida por este serviço
|
|
20
20
|
*
|
|
21
21
|
* @memberof SecurityService
|
|
22
22
|
*/
|
|
23
|
-
getPrivateKey():
|
|
23
|
+
getPrivateKey(): JWK.Key;
|
|
24
24
|
/**
|
|
25
25
|
* Chave publica emitida por este serviço
|
|
26
26
|
*
|
|
27
27
|
* @memberof SecurityService
|
|
28
28
|
*/
|
|
29
|
-
getPublicKey():
|
|
29
|
+
getPublicKey(): JWK.Key;
|
|
30
30
|
/**
|
|
31
31
|
* Chave publica emitida pelo serviço do hub se sessões
|
|
32
32
|
*
|
|
33
33
|
* @memberof SecurityService
|
|
34
34
|
*/
|
|
35
|
-
getServicePublicKey():
|
|
35
|
+
getServicePublicKey(): JWK.Key;
|
|
36
36
|
/**
|
|
37
37
|
* Criptografía utilizando chave publica
|
|
38
38
|
*
|
|
39
39
|
* @param {TSignData} data
|
|
40
40
|
* @memberof SecurityService
|
|
41
41
|
*/
|
|
42
|
-
encrypt(data: TSignData, publicKey:
|
|
42
|
+
encrypt(data: TSignData, publicKey: JWK.Key): Promise<string | false>;
|
|
43
43
|
/**
|
|
44
44
|
* Descriptografia utilizando chave privada
|
|
45
45
|
*
|
|
46
46
|
* @param {string} encryptedData
|
|
47
47
|
* @memberof SecurityService
|
|
48
48
|
*/
|
|
49
|
-
decrypt<T = any>(encryptedData: string, privateKey:
|
|
49
|
+
decrypt<T = any>(encryptedData: string, privateKey: JWK.Key): Promise<T | false>;
|
|
50
50
|
/**
|
|
51
51
|
* Realiza uma assinatura usando chave privada
|
|
52
52
|
*
|
|
53
53
|
* @param {TSignData} data
|
|
54
54
|
* @memberof SecurityService
|
|
55
55
|
*/
|
|
56
|
-
sign(data: TSignData, privateKey:
|
|
56
|
+
sign(data: TSignData, privateKey: JWK.Key): Promise<string | undefined>;
|
|
57
57
|
/**
|
|
58
58
|
* Verifica assinatura utilizando chave publica
|
|
59
59
|
*
|
|
60
60
|
* @param {string} signature
|
|
61
61
|
* @memberof SecurityService
|
|
62
62
|
*/
|
|
63
|
-
verifySignature<T = any>(signature: string, publicKey:
|
|
63
|
+
verifySignature<T = any>(signature: string, publicKey: JWK.Key): Promise<(TSignData<T> & Record<string, any>) | false>;
|
|
64
64
|
/**
|
|
65
65
|
* Criptografía de dados utilizando um buffer automático ao invés de chaves
|
|
66
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAY,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAQ,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,cAAM,eAAgB,SAAQ,OAAO;IACnC,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,gBAAgB,CAAW;IAEtB,OAAO;IAWpB,OAAO,CAAC,UAAU;YAMJ,cAAc;YAad,aAAa;IAMd,cAAc;;;;IASd,oBAAoB;IAUpB,YAAY,CAAC,IAAI,EAAE,MAAM;IAItC;;;;OAIG;IACI,aAAa;IAGpB;;;;OAIG;IACI,YAAY;IAGnB;;;;OAIG;IACI,mBAAmB;IAG1B;;;;;OAKG;IACU,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG;IAmBxD;;;;;OAKG;IACU,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;IAY7F;;;;;OAKG;IACU,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG;IAmBtD;;;;;OAKG;IACU,eAAe,CAAC,CAAC,GAAG,GAAG,EAClC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,GAAG,CAAC,GAAG,GACjB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAaxD;;;;;OAKG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAa7D;;;;;;OAMG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK;CAqBhE;AAED,eAAe,eAAe,CAAC"}
|
package/lib/services/security.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as crypto from 'crypto';
|
|
2
2
|
import * as fs from 'fs';
|
|
3
|
-
import
|
|
3
|
+
import { JWK, JWS, JWE } from 'node-jose';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import { Core, Service, ErrorHandler } from '../app/index.js';
|
|
6
6
|
class SecurityService extends Service {
|
|
@@ -24,11 +24,11 @@ class SecurityService extends Service {
|
|
|
24
24
|
const privateKeyPath = path.join(Core.settings.getAuthentication().certPath, 'private_key.pem');
|
|
25
25
|
if (fs.existsSync(privateKeyPath)) {
|
|
26
26
|
const pem = fs.readFileSync(privateKeyPath, 'utf8');
|
|
27
|
-
this.privateKey = await
|
|
27
|
+
this.privateKey = await JWK.asKey(pem, 'pem');
|
|
28
28
|
}
|
|
29
29
|
else {
|
|
30
30
|
const { privateKey } = await this.createKeyPairs();
|
|
31
|
-
this.privateKey = await
|
|
31
|
+
this.privateKey = await JWK.asKey(privateKey, 'pem');
|
|
32
32
|
const pem = this.privateKey.toPEM(true);
|
|
33
33
|
fs.writeFileSync(privateKeyPath, pem, 'utf8');
|
|
34
34
|
}
|
|
@@ -36,11 +36,11 @@ class SecurityService extends Service {
|
|
|
36
36
|
async loadPublicKey() {
|
|
37
37
|
const publicKeyPath = path.join(Core.settings.getAuthentication().certPath, 'public_key.pem');
|
|
38
38
|
const pem = this.privateKey.toPEM(false);
|
|
39
|
-
this.publicKey = await
|
|
39
|
+
this.publicKey = await JWK.asKey(pem, 'pem');
|
|
40
40
|
fs.writeFileSync(publicKeyPath, pem, 'utf8');
|
|
41
41
|
}
|
|
42
42
|
async createKeyPairs() {
|
|
43
|
-
const keyPair = await
|
|
43
|
+
const keyPair = await JWK.createKey('RSA', 2048, {
|
|
44
44
|
alg: 'RS256',
|
|
45
45
|
use: 'sig',
|
|
46
46
|
iss: Core.settings.getAuthentication().issuer
|
|
@@ -50,14 +50,14 @@ class SecurityService extends Service {
|
|
|
50
50
|
async loadServicePublicKey() {
|
|
51
51
|
if (fs.existsSync(Core.settings.getAuthentication().servicePublicKeyPath)) {
|
|
52
52
|
const pem = fs.readFileSync(Core.settings.getAuthentication().servicePublicKeyPath, 'utf8');
|
|
53
|
-
this.servicePublicKey = await
|
|
53
|
+
this.servicePublicKey = await JWK.asKey(pem, 'pem');
|
|
54
54
|
}
|
|
55
55
|
else {
|
|
56
56
|
throw new Error('Não foi possível localizar o certificado de serviço. Verifique o caminho nas configurações');
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
async loadKeyByStr(data) {
|
|
60
|
-
return await
|
|
60
|
+
return await JWK.asKey(data, 'pem');
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Chave privada emitida por este serviço
|
|
@@ -98,7 +98,7 @@ class SecurityService extends Service {
|
|
|
98
98
|
};
|
|
99
99
|
const payload = JSON.stringify({ ...defaults, ...data });
|
|
100
100
|
try {
|
|
101
|
-
const encrypted = await
|
|
101
|
+
const encrypted = await JWE.createEncrypt({ format: 'compact' }, publicKey)
|
|
102
102
|
.update(payload)
|
|
103
103
|
.final();
|
|
104
104
|
return encrypted;
|
|
@@ -116,7 +116,7 @@ class SecurityService extends Service {
|
|
|
116
116
|
*/
|
|
117
117
|
async decrypt(encryptedData, privateKey) {
|
|
118
118
|
try {
|
|
119
|
-
const decrypted = await
|
|
119
|
+
const decrypted = await JWE.createDecrypt(privateKey).decrypt(encryptedData);
|
|
120
120
|
const result = decrypted.plaintext.toString();
|
|
121
121
|
const parserd = JSON.parse(result);
|
|
122
122
|
// Tenta parsear como JSON se for objeto
|
|
@@ -142,7 +142,7 @@ class SecurityService extends Service {
|
|
|
142
142
|
};
|
|
143
143
|
try {
|
|
144
144
|
const payload = JSON.stringify({ ...defaults, ...data });
|
|
145
|
-
const signature = (await
|
|
145
|
+
const signature = (await JWS.createSign({ compact: true, fields: { typ: 'jwt' } }, privateKey)
|
|
146
146
|
.update(payload, 'utf8')
|
|
147
147
|
.final());
|
|
148
148
|
return signature;
|
|
@@ -159,7 +159,7 @@ class SecurityService extends Service {
|
|
|
159
159
|
*/
|
|
160
160
|
async verifySignature(signature, publicKey) {
|
|
161
161
|
try {
|
|
162
|
-
const result = await
|
|
162
|
+
const result = await JWS.createVerify(publicKey).verify(signature);
|
|
163
163
|
const payload = result.payload.toString();
|
|
164
164
|
return JSON.parse(payload);
|
|
165
165
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/services/security.ts"],"names":[],"mappings":"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"}
|