@prosopo/api-express-router 3.0.40 → 3.1.17
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/.turbo/turbo-build$colon$cjs.log +11 -7
- package/.turbo/turbo-build$colon$tsc.log +62 -0
- package/.turbo/turbo-build.log +16 -8
- package/CHANGELOG.md +389 -0
- package/dist/apiExpressRouterFactory.d.ts +9 -0
- package/dist/apiExpressRouterFactory.d.ts.map +1 -0
- package/dist/apiExpressRouterFactory.js.map +1 -0
- package/dist/cjs/endpointAdapter/apiExpressDefaultEndpointAdapter.cjs +2 -1
- package/dist/cjs/middlewares/authMiddleware.cjs +18 -41
- package/dist/cjs/middlewares/requestLoggerMiddleware.cjs +14 -4
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts +13 -0
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.d.ts.map +1 -0
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js +2 -1
- package/dist/endpointAdapter/apiExpressDefaultEndpointAdapter.js.map +1 -0
- package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts +8 -0
- package/dist/endpointAdapter/apiExpressEndpointAdapter.d.ts.map +1 -0
- package/dist/endpointAdapter/apiExpressEndpointAdapter.js +2 -0
- package/dist/endpointAdapter/apiExpressEndpointAdapter.js.map +1 -0
- package/dist/errorHandler.d.ts +5 -0
- package/dist/errorHandler.d.ts.map +1 -0
- package/dist/errorHandler.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/authMiddleware.d.ts +5 -0
- package/dist/middlewares/authMiddleware.d.ts.map +1 -0
- package/dist/middlewares/authMiddleware.js +19 -42
- package/dist/middlewares/authMiddleware.js.map +1 -0
- package/dist/middlewares/requestLoggerMiddleware.d.ts +4 -0
- package/dist/middlewares/requestLoggerMiddleware.d.ts.map +1 -0
- package/dist/middlewares/requestLoggerMiddleware.js +11 -1
- package/dist/middlewares/requestLoggerMiddleware.js.map +1 -0
- package/dist/tests/unit/errorHandler.unit.test.d.ts +2 -0
- package/dist/tests/unit/errorHandler.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/errorHandler.unit.test.js +140 -0
- package/dist/tests/unit/errorHandler.unit.test.js.map +1 -0
- package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts +2 -0
- package/dist/tests/unit/middlewares/authMiddleware.unit.test.d.ts.map +1 -0
- package/dist/tests/unit/middlewares/authMiddleware.unit.test.js +144 -0
- package/dist/tests/unit/middlewares/authMiddleware.unit.test.js.map +1 -0
- package/express.d.ts +4 -2
- package/package.json +17 -9
- package/src/apiExpressRouterFactory.ts +68 -0
- package/src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts +65 -0
- package/src/endpointAdapter/apiExpressEndpointAdapter.ts +28 -0
- package/src/errorHandler.ts +33 -0
- package/src/index.ts +37 -0
- package/src/middlewares/authMiddleware.ts +93 -0
- package/src/middlewares/requestLoggerMiddleware.ts +55 -0
- package/src/tests/unit/errorHandler.unit.test.ts +190 -0
- package/src/tests/unit/middlewares/authMiddleware.unit.test.ts +183 -0
- package/tsconfig.cjs.json +34 -0
- package/tsconfig.json +41 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsconfig.types.json +9 -0
- package/vite.cjs.config.ts +1 -1
- package/vite.esm.config.ts +1 -1
- package/vite.test.config.ts +1 -1
|
@@ -1,19 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const
|
|
3
|
+
const logger = require("@prosopo/logger");
|
|
4
4
|
const uuid = require("uuid");
|
|
5
|
+
const getHeaderValue = (req, headerName) => {
|
|
6
|
+
if (headerName in req.headers && req.headers[headerName]) {
|
|
7
|
+
return req.headers[headerName].toString();
|
|
8
|
+
}
|
|
9
|
+
return void 0;
|
|
10
|
+
};
|
|
5
11
|
function requestLoggerMiddleware(env) {
|
|
6
12
|
return (req, res, next) => {
|
|
7
13
|
const requestId = req.headers["x-request-id"] || `e-${uuid.v4()}`;
|
|
14
|
+
const user = getHeaderValue(req, "prosopo-user");
|
|
15
|
+
const siteKey = getHeaderValue(req, "prosopo-site-key");
|
|
8
16
|
const sessionId = req.body?.sessionId ? req.body.sessionId : null;
|
|
9
|
-
const logger =
|
|
10
|
-
|
|
17
|
+
const logger$1 = logger.getLogger(
|
|
18
|
+
logger.parseLogLevel(env.config.logLevel),
|
|
11
19
|
"request-logger"
|
|
12
20
|
).with({
|
|
13
21
|
requestId,
|
|
22
|
+
...user ? { user } : {},
|
|
23
|
+
...siteKey ? { siteKey } : {},
|
|
14
24
|
...sessionId ? { sessionId } : {}
|
|
15
25
|
});
|
|
16
|
-
req.logger = logger;
|
|
26
|
+
req.logger = logger$1;
|
|
17
27
|
req.requestId = requestId;
|
|
18
28
|
next();
|
|
19
29
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ApiEndpoint } from "@prosopo/api-route";
|
|
2
|
+
import { type LogLevel } from "@prosopo/logger";
|
|
3
|
+
import type { NextFunction, Request, Response } from "express";
|
|
4
|
+
import type { ZodType } from "zod";
|
|
5
|
+
import type { ApiExpressEndpointAdapter } from "./apiExpressEndpointAdapter.js";
|
|
6
|
+
declare class ApiExpressDefaultEndpointAdapter implements ApiExpressEndpointAdapter {
|
|
7
|
+
private readonly logLevel;
|
|
8
|
+
private readonly errorStatusCode;
|
|
9
|
+
constructor(logLevel: LogLevel, errorStatusCode: number);
|
|
10
|
+
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export { ApiExpressDefaultEndpointAdapter };
|
|
13
|
+
//# sourceMappingURL=apiExpressDefaultEndpointAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiExpressDefaultEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,KAAK,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,cAAM,gCAAiC,YAAW,yBAAyB;IAEzE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBADf,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,MAAM;IAG5B,aAAa,CACzB,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC;CA8BhB;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ProsopoApiError
|
|
1
|
+
import { ProsopoApiError } from "@prosopo/common";
|
|
2
|
+
import { stringifyBigInts } from "@prosopo/logger";
|
|
2
3
|
class ApiExpressDefaultEndpointAdapter {
|
|
3
4
|
constructor(logLevel, errorStatusCode) {
|
|
4
5
|
this.logLevel = logLevel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiExpressDefaultEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressDefaultEndpointAdapter.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAiB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKlE,MAAM,gCAAgC;IACrC,YACkB,QAAkB,EAClB,eAAuB;QADvB,aAAQ,GAAR,QAAQ,CAAU;QAClB,oBAAe,GAAf,eAAe,CAAQ;IACtC,CAAC;IAEG,KAAK,CAAC,aAAa,CACzB,QAA0C,EAC1C,OAAgB,EAChB,QAAkB,EAClB,IAAkB;QAElB,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACJ,IAAI,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CACV,IAAI,eAAe,CAAC,iBAAiB,EAAE;gBACtC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;aACpC,CAAC,CACF,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,mBAAmB,GAAG,MAAM,QAAQ,CAAC,cAAc,CACxD,IAAI,EACJ,OAAO,CAAC,MAAM,CACd,CAAC;YAGF,MAAM,cAAc,GAAG,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;YAE7D,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC3B,GAAG,EAAE,KAAK;aACV,CAAC,CAAC,CAAC;YAEJ,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;CACD;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ApiEndpoint } from "@prosopo/api-route";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
|
+
import type { ZodType } from "zod";
|
|
4
|
+
interface ApiExpressEndpointAdapter {
|
|
5
|
+
handleRequest(endpoint: ApiEndpoint<ZodType | undefined>, request: Request, response: Response, next: NextFunction): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export type { ApiExpressEndpointAdapter };
|
|
8
|
+
//# sourceMappingURL=apiExpressEndpointAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiExpressEndpointAdapter.d.ts","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAEnC,UAAU,yBAAyB;IAClC,aAAa,CACZ,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,SAAS,CAAC,EAC1C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,YAAY,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiExpressEndpointAdapter.js","sourceRoot":"","sources":["../../src/endpointAdapter/apiExpressEndpointAdapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ProsopoApiError } from "@prosopo/common";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
|
+
import type { ZodError } from "zod";
|
|
4
|
+
export declare const handleErrors: (err: ProsopoApiError | SyntaxError | ZodError, request: Request, response: Response, next: NextFunction) => void;
|
|
5
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,iBAAiB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEpC,eAAO,MAAM,YAAY,QACnB,eAAe,GAAG,WAAW,GAAG,QAAQ,WACpC,OAAO,YACN,QAAQ,QACZ,YAAY,SAQlB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../src/errorHandler.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAwB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,GAA6C,EAC7C,OAAgB,EAChB,QAAkB,EAClB,IAAkB,EACjB,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LogLevel } from "@prosopo/logger";
|
|
2
|
+
import { ApiExpressRouterFactory } from "./apiExpressRouterFactory.js";
|
|
3
|
+
import type { ApiExpressEndpointAdapter } from "./endpointAdapter/apiExpressEndpointAdapter.js";
|
|
4
|
+
declare const apiExpressRouterFactory: ApiExpressRouterFactory;
|
|
5
|
+
declare const createApiExpressDefaultEndpointAdapter: (logLevel: LogLevel, errorStatusCode?: number) => ApiExpressEndpointAdapter;
|
|
6
|
+
export { apiExpressRouterFactory, createApiExpressDefaultEndpointAdapter, type ApiExpressEndpointAdapter, };
|
|
7
|
+
export * from "./errorHandler.js";
|
|
8
|
+
export * from "./middlewares/authMiddleware.js";
|
|
9
|
+
export * from "./middlewares/requestLoggerMiddleware.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAEhG,QAAA,MAAM,uBAAuB,yBAAgC,CAAC;AAE9D,QAAA,MAAM,sCAAsC,aACjC,QAAQ,+BAEhB,yBAEF,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,EACtC,KAAK,yBAAyB,GAC9B,CAAC;AAEF,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uDAAuD,CAAC;AAGzG,MAAM,uBAAuB,GAAG,IAAI,uBAAuB,EAAE,CAAC;AAE9D,MAAM,sCAAsC,GAAG,CAC9C,QAAkB,EAClB,eAAe,GAAG,GAAG,EACO,EAAE;IAC9B,OAAO,IAAI,gCAAgC,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,OAAO,EACN,uBAAuB,EACvB,sCAAsC,GAEtC,CAAC;AAEF,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,0CAA0C,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { KeyringPair } from "@prosopo/types";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
|
+
export declare const authMiddleware: (pair: KeyringPair | undefined, authAccount?: KeyringPair | undefined) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
4
|
+
export declare const verifySignature: (signature: string, message: string, pair: KeyringPair) => void;
|
|
5
|
+
//# sourceMappingURL=authMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authMiddleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/authMiddleware.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,cAAc,SACpB,WAAW,GAAG,SAAS,gBACf,WAAW,GAAG,SAAS,WAElB,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBA4B7D,CAAC;AAsBF,eAAO,MAAM,eAAe,cAChB,MAAM,WACR,MAAM,QACT,WAAW,SAejB,CAAC"}
|
|
@@ -1,33 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { hexToU8a } from "@polkadot/util";
|
|
2
2
|
import { ProsopoEnvError, ProsopoApiError } from "@prosopo/common";
|
|
3
3
|
const authMiddleware = (pair, authAccount) => {
|
|
4
4
|
return async (req, res, next) => {
|
|
5
5
|
try {
|
|
6
|
-
const
|
|
6
|
+
const jwt = extractJWT(req);
|
|
7
7
|
let error;
|
|
8
|
-
if (authAccount) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
next();
|
|
12
|
-
return;
|
|
13
|
-
} catch (e) {
|
|
14
|
-
req.logger.warn(() => ({
|
|
15
|
-
err: e,
|
|
16
|
-
data: {
|
|
17
|
-
account: authAccount?.address
|
|
18
|
-
}
|
|
19
|
-
}));
|
|
20
|
-
error = e;
|
|
21
|
-
}
|
|
8
|
+
if (authAccount?.jwtVerify(jwt).isValid) {
|
|
9
|
+
next();
|
|
10
|
+
return;
|
|
22
11
|
}
|
|
23
|
-
if (pair) {
|
|
24
|
-
verifySignature(signature, timestamp, pair);
|
|
12
|
+
if (pair?.jwtVerify(jwt).isValid) {
|
|
25
13
|
next();
|
|
26
14
|
return;
|
|
27
15
|
}
|
|
28
16
|
res.status(401).json({
|
|
29
|
-
error: "
|
|
30
|
-
|
|
17
|
+
error: new ProsopoEnvError(error || "API.UNAUTHORIZED", {
|
|
18
|
+
context: { i18n: req.i18n, code: 401 }
|
|
19
|
+
})
|
|
31
20
|
});
|
|
32
21
|
return;
|
|
33
22
|
} catch (err) {
|
|
@@ -37,32 +26,20 @@ const authMiddleware = (pair, authAccount) => {
|
|
|
37
26
|
}
|
|
38
27
|
};
|
|
39
28
|
};
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
context: { error: "Missing timestamp", code: 400 }
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
if (!signature) {
|
|
49
|
-
throw new ProsopoApiError("GENERAL.INVALID_SIGNATURE", {
|
|
50
|
-
context: { error: "Missing signature", code: 400 }
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
if (Array.isArray(signature) || Array.isArray(timestamp) || !isHex(signature)) {
|
|
54
|
-
throw new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
|
|
55
|
-
context: { error: "Invalid header format", code: 400 }
|
|
29
|
+
const extractJWT = (req) => {
|
|
30
|
+
const authHeader = req.headers.Authorization || req.headers.authorization;
|
|
31
|
+
if (!authHeader || typeof authHeader !== "string") {
|
|
32
|
+
throw new ProsopoApiError("GENERAL.MISSING_AUTH_HEADER", {
|
|
33
|
+
context: { error: "Missing Authorization header", code: 401 }
|
|
56
34
|
});
|
|
57
35
|
}
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
context: { error: "Timestamp is too old", code: 400 }
|
|
36
|
+
const jwt = authHeader.replace("Bearer ", "");
|
|
37
|
+
if (!jwt) {
|
|
38
|
+
throw new ProsopoApiError("GENERAL.INVALID_JWT", {
|
|
39
|
+
context: { error: "Missing JWT", code: 400 }
|
|
63
40
|
});
|
|
64
41
|
}
|
|
65
|
-
return
|
|
42
|
+
return jwt;
|
|
66
43
|
};
|
|
67
44
|
const verifySignature = (signature, message, pair) => {
|
|
68
45
|
const u8Sig = hexToU8a(signature);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authMiddleware.js","sourceRoot":"","sources":["../../src/middlewares/authMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,IAA6B,EAC7B,WAAqC,EACpC,EAAE;IACH,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAE5B,IAAI,KAAkC,CAAC;YAEvC,IAAI,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,IAAI,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACpB,KAAK,EAAE,IAAI,eAAe,CAAC,KAAK,IAAI,kBAAkB,EAAE;oBACvD,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;iBACtC,CAAC;aACF,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAChE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9D,OAAO;QACR,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,EAAE;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IAE1E,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,IAAI,eAAe,CAAC,6BAA6B,EAAE;YACxD,OAAO,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,EAAE,GAAG,EAAE;SAC7D,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,eAAe,CAAC,qBAAqB,EAAE;YAChD,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE;SAC5C,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,GAAU,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,SAAiB,EACjB,OAAe,EACf,IAAiB,EAChB,EAAE;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;YACtD,OAAO,EAAE;gBACR,KAAK,EAAE,+BAA+B;gBACtC,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO;gBACP,SAAS;aACT;SACD,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ProviderEnvironment } from "@prosopo/env";
|
|
2
|
+
import type { NextFunction, Request, Response } from "express";
|
|
3
|
+
export declare function requestLoggerMiddleware(env: ProviderEnvironment): (req: Request, res: Response, next: NextFunction) => void;
|
|
4
|
+
//# sourceMappingURL=requestLoggerMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestLoggerMiddleware.d.ts","sourceRoot":"","sources":["../../src/middlewares/requestLoggerMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAa/D,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,mBAAmB,SAClD,OAAO,OAAO,QAAQ,QAAQ,YAAY,UAwBvD"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
|
-
import { getLogger, parseLogLevel } from "@prosopo/
|
|
1
|
+
import { getLogger, parseLogLevel } from "@prosopo/logger";
|
|
2
2
|
import { v4 } from "uuid";
|
|
3
|
+
const getHeaderValue = (req, headerName) => {
|
|
4
|
+
if (headerName in req.headers && req.headers[headerName]) {
|
|
5
|
+
return req.headers[headerName].toString();
|
|
6
|
+
}
|
|
7
|
+
return void 0;
|
|
8
|
+
};
|
|
3
9
|
function requestLoggerMiddleware(env) {
|
|
4
10
|
return (req, res, next) => {
|
|
5
11
|
const requestId = req.headers["x-request-id"] || `e-${v4()}`;
|
|
12
|
+
const user = getHeaderValue(req, "prosopo-user");
|
|
13
|
+
const siteKey = getHeaderValue(req, "prosopo-site-key");
|
|
6
14
|
const sessionId = req.body?.sessionId ? req.body.sessionId : null;
|
|
7
15
|
const logger = getLogger(
|
|
8
16
|
parseLogLevel(env.config.logLevel),
|
|
9
17
|
"request-logger"
|
|
10
18
|
).with({
|
|
11
19
|
requestId,
|
|
20
|
+
...user ? { user } : {},
|
|
21
|
+
...siteKey ? { siteKey } : {},
|
|
12
22
|
...sessionId ? { sessionId } : {}
|
|
13
23
|
});
|
|
14
24
|
req.logger = logger;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestLoggerMiddleware.js","sourceRoot":"","sources":["../../src/middlewares/requestLoggerMiddleware.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,MAAM,cAAc,GAAG,CACtB,GAAY,EACZ,UAAkB,EACG,EAAE;IACvB,IAAI,UAAU,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,GAAwB;IAC/D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC1D,MAAM,SAAS,GACb,GAAG,CAAC,OAAO,CAAC,cAAc,CAAY,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAElE,MAAM,MAAM,GAAG,SAAS,CACvB,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAClC,gBAAgB,CAChB,CAAC,IAAI,CAAC;YACN,SAAS;YACT,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnC,CAAC,CAAC;QAGH,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;QAG1B,IAAI,EAAE,CAAC;IACR,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.unit.test.d.ts","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
|
|
2
|
+
import { loadI18next } from "@prosopo/locale";
|
|
3
|
+
import { describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { ZodError } from "zod";
|
|
5
|
+
import { handleErrors } from "../../errorHandler.js";
|
|
6
|
+
describe("handleErrors", async () => {
|
|
7
|
+
const i18n = await loadI18next(true);
|
|
8
|
+
await i18n.changeLanguage("en");
|
|
9
|
+
it("should handle ProsopoApiError", async () => {
|
|
10
|
+
const mockRequest = { i18n };
|
|
11
|
+
const mockResponse = {
|
|
12
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
13
|
+
set: vi.fn().mockReturnThis(),
|
|
14
|
+
status: vi.fn().mockReturnThis(),
|
|
15
|
+
send: vi.fn(),
|
|
16
|
+
end: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
const mockNext = vi.fn();
|
|
19
|
+
const error = new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
|
|
20
|
+
context: { code: 400 },
|
|
21
|
+
i18n,
|
|
22
|
+
});
|
|
23
|
+
console.log(error);
|
|
24
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
25
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
26
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
27
|
+
error: {
|
|
28
|
+
code: 400,
|
|
29
|
+
key: "CONTRACT.INVALID_DATA_FORMAT",
|
|
30
|
+
message: "Invalid data format",
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
34
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
35
|
+
});
|
|
36
|
+
it("should not return SyntaxError", async () => {
|
|
37
|
+
const mockRequest = { i18n };
|
|
38
|
+
const mockResponse = {
|
|
39
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
40
|
+
set: vi.fn().mockReturnThis(),
|
|
41
|
+
status: vi.fn().mockReturnThis(),
|
|
42
|
+
send: vi.fn(),
|
|
43
|
+
end: vi.fn(),
|
|
44
|
+
};
|
|
45
|
+
const mockNext = vi.fn();
|
|
46
|
+
const message = "Unknown API error";
|
|
47
|
+
const error = new SyntaxError(message);
|
|
48
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
49
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
50
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
51
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
52
|
+
error: {
|
|
53
|
+
message,
|
|
54
|
+
key: "API.UNKNOWN",
|
|
55
|
+
code: 400,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
59
|
+
});
|
|
60
|
+
it("should handle ZodError", () => {
|
|
61
|
+
const mockRequest = { i18n };
|
|
62
|
+
const mockResponse = {
|
|
63
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
64
|
+
set: vi.fn().mockReturnThis(),
|
|
65
|
+
status: vi.fn().mockReturnThis(),
|
|
66
|
+
send: vi.fn(),
|
|
67
|
+
end: vi.fn(),
|
|
68
|
+
};
|
|
69
|
+
const mockNext = vi.fn();
|
|
70
|
+
const zodError = {
|
|
71
|
+
code: "custom",
|
|
72
|
+
message: "Invalid input",
|
|
73
|
+
path: ["some", "variable"],
|
|
74
|
+
};
|
|
75
|
+
const error = new ZodError([zodError]);
|
|
76
|
+
handleErrors(error, mockRequest, mockResponse, mockNext);
|
|
77
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
78
|
+
expect(mockResponse.status).toHaveBeenCalledWith(400);
|
|
79
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
80
|
+
error: { code: 400, key: "API.INVALID_BODY", message: [zodError] },
|
|
81
|
+
});
|
|
82
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
it("should unwrap nested ProsopoBaseError", async () => {
|
|
85
|
+
const mockRequest = { i18n };
|
|
86
|
+
const mockResponse = {
|
|
87
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
88
|
+
set: vi.fn().mockReturnThis(),
|
|
89
|
+
status: vi.fn().mockReturnThis(),
|
|
90
|
+
send: vi.fn(),
|
|
91
|
+
end: vi.fn(),
|
|
92
|
+
};
|
|
93
|
+
const mockNext = vi.fn();
|
|
94
|
+
const envError = new ProsopoEnvError("GENERAL.ENVIRONMENT_NOT_READY", {
|
|
95
|
+
i18n,
|
|
96
|
+
});
|
|
97
|
+
const apiError = new ProsopoApiError(envError);
|
|
98
|
+
handleErrors(apiError, mockRequest, mockResponse, mockNext);
|
|
99
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
100
|
+
expect(mockResponse.status).toHaveBeenCalledWith(500);
|
|
101
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
102
|
+
error: {
|
|
103
|
+
code: 500,
|
|
104
|
+
key: "GENERAL.ENVIRONMENT_NOT_READY",
|
|
105
|
+
message: "Environment not ready",
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it("should unwrap nested ProsopoBaseErrors but not an Error that is nested inside them", async () => {
|
|
111
|
+
const mockRequest = { i18n };
|
|
112
|
+
const mockResponse = {
|
|
113
|
+
writeHead: vi.fn().mockReturnThis(),
|
|
114
|
+
set: vi.fn().mockReturnThis(),
|
|
115
|
+
status: vi.fn().mockReturnThis(),
|
|
116
|
+
send: vi.fn(),
|
|
117
|
+
end: vi.fn(),
|
|
118
|
+
};
|
|
119
|
+
const mockNext = vi.fn();
|
|
120
|
+
const code = 400;
|
|
121
|
+
const key = "API.UNKNOWN";
|
|
122
|
+
const error = new Error("Some error");
|
|
123
|
+
const apiError = new ProsopoApiError(key, {
|
|
124
|
+
context: { code, error },
|
|
125
|
+
i18n,
|
|
126
|
+
});
|
|
127
|
+
handleErrors(apiError, mockRequest, mockResponse, mockNext);
|
|
128
|
+
expect(mockResponse.set).toHaveBeenCalledWith("content-type", "application/json");
|
|
129
|
+
expect(mockResponse.status).toHaveBeenCalledWith(code);
|
|
130
|
+
expect(mockResponse.send).toHaveBeenCalledWith({
|
|
131
|
+
error: {
|
|
132
|
+
code,
|
|
133
|
+
key,
|
|
134
|
+
message: "Unknown API error",
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
expect(mockResponse.end).toHaveBeenCalled();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=errorHandler.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.unit.test.js","sourceRoot":"","sources":["../../../src/tests/unit/errorHandler.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authMiddleware.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { hexToU8a, isHex } from "@polkadot/util";
|
|
2
|
+
import { ProsopoEnvError } from "@prosopo/common";
|
|
3
|
+
import { getLogger } from "@prosopo/logger";
|
|
4
|
+
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { authMiddleware } from "../../../middlewares/authMiddleware.js";
|
|
6
|
+
const loggerOuter = getLogger("info", import.meta.url);
|
|
7
|
+
const mockLogger = {
|
|
8
|
+
debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
|
|
9
|
+
log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
|
|
10
|
+
info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
|
|
11
|
+
error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
|
|
12
|
+
trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
|
|
13
|
+
fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
|
|
14
|
+
warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
|
|
15
|
+
};
|
|
16
|
+
vi.mock("@polkadot/util", async (importOriginal) => {
|
|
17
|
+
const actual = await importOriginal();
|
|
18
|
+
return {
|
|
19
|
+
...actual,
|
|
20
|
+
hexToU8a: vi.fn(),
|
|
21
|
+
isHex: vi.fn(),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
const mockPair = {
|
|
25
|
+
publicKey: "mockPublicKey",
|
|
26
|
+
verify: vi.fn(),
|
|
27
|
+
jwtVerify: vi.fn(),
|
|
28
|
+
};
|
|
29
|
+
const mockEnv = {
|
|
30
|
+
pair: mockPair,
|
|
31
|
+
authAccount: mockPair,
|
|
32
|
+
logger: mockLogger,
|
|
33
|
+
jwtVerify: vi.fn(),
|
|
34
|
+
};
|
|
35
|
+
describe("authMiddleware", () => {
|
|
36
|
+
it("should call next() if signature is valid", async () => {
|
|
37
|
+
const mockLogger = {
|
|
38
|
+
debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
|
|
39
|
+
log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
|
|
40
|
+
info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
|
|
41
|
+
error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
|
|
42
|
+
trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
|
|
43
|
+
fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
|
|
44
|
+
warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
|
|
45
|
+
};
|
|
46
|
+
const mockReq = {
|
|
47
|
+
url: "/v1/prosopo/provider/captcha/image",
|
|
48
|
+
originalUrl: "/v1/prosopo/provider/captcha/image",
|
|
49
|
+
headers: {
|
|
50
|
+
Authorization: "Bearer mockToken",
|
|
51
|
+
},
|
|
52
|
+
logger: mockLogger,
|
|
53
|
+
};
|
|
54
|
+
const mockRes = {
|
|
55
|
+
status: vi.fn().mockReturnThis(),
|
|
56
|
+
json: vi.fn(),
|
|
57
|
+
};
|
|
58
|
+
const mockNext = vi.fn();
|
|
59
|
+
vi.mocked(isHex).mockReturnValue(true);
|
|
60
|
+
vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
|
|
61
|
+
vi.mocked(mockPair.jwtVerify).mockReturnValue({
|
|
62
|
+
isValid: true,
|
|
63
|
+
});
|
|
64
|
+
const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
|
|
65
|
+
await middleware(mockReq, mockRes, mockNext);
|
|
66
|
+
expect(mockNext).toHaveBeenCalled();
|
|
67
|
+
expect(mockRes.status).not.toHaveBeenCalled();
|
|
68
|
+
});
|
|
69
|
+
it("should return 401 if jwt is invalid", async () => {
|
|
70
|
+
const mockLogger = {
|
|
71
|
+
debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
|
|
72
|
+
log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
|
|
73
|
+
info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
|
|
74
|
+
error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
|
|
75
|
+
trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
|
|
76
|
+
fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
|
|
77
|
+
warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
|
|
78
|
+
};
|
|
79
|
+
const mockReq = {
|
|
80
|
+
url: "/v1/prosopo/provider/captcha/image",
|
|
81
|
+
originalUrl: "/v1/prosopo/provider/captcha/image",
|
|
82
|
+
headers: {
|
|
83
|
+
Authorization: "Bearer mockToken",
|
|
84
|
+
},
|
|
85
|
+
logger: mockLogger,
|
|
86
|
+
i18n: vi.fn().mockReturnValue({
|
|
87
|
+
t: (key) => key,
|
|
88
|
+
}),
|
|
89
|
+
};
|
|
90
|
+
const mockRes = {
|
|
91
|
+
status: vi.fn().mockReturnThis(),
|
|
92
|
+
json: vi.fn(),
|
|
93
|
+
};
|
|
94
|
+
const mockNext = vi.fn();
|
|
95
|
+
vi.mocked(isHex).mockReturnValue(true);
|
|
96
|
+
vi.mocked(hexToU8a).mockReturnValue(new Uint8Array());
|
|
97
|
+
vi.mocked(mockPair.jwtVerify).mockReturnValue({
|
|
98
|
+
isValid: false,
|
|
99
|
+
});
|
|
100
|
+
const middleware = authMiddleware(mockEnv.pair, mockEnv.authAccount);
|
|
101
|
+
await middleware(mockReq, mockRes, mockNext);
|
|
102
|
+
expect(mockNext).not.toHaveBeenCalled();
|
|
103
|
+
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
104
|
+
expect(mockRes.json).toHaveBeenCalledWith({
|
|
105
|
+
error: new ProsopoEnvError("API.UNAUTHORIZED", {
|
|
106
|
+
context: { i18n: mockReq.i18n, code: 401 },
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it("should return 401 if key pair is missing", async () => {
|
|
111
|
+
const mockLogger = {
|
|
112
|
+
debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
|
|
113
|
+
log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
|
|
114
|
+
info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
|
|
115
|
+
error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
|
|
116
|
+
trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
|
|
117
|
+
fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
|
|
118
|
+
warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
|
|
119
|
+
};
|
|
120
|
+
const mockReq = {
|
|
121
|
+
url: "/v1/prosopo/provider/captcha/image",
|
|
122
|
+
originalUrl: "/v1/prosopo/provider/captcha/image",
|
|
123
|
+
headers: {
|
|
124
|
+
Authorization: "Bearer mockToken",
|
|
125
|
+
},
|
|
126
|
+
logger: mockLogger,
|
|
127
|
+
};
|
|
128
|
+
const mockRes = {
|
|
129
|
+
status: vi.fn().mockReturnThis(),
|
|
130
|
+
json: vi.fn(),
|
|
131
|
+
};
|
|
132
|
+
const mockNext = vi.fn();
|
|
133
|
+
const middleware = authMiddleware(undefined, undefined);
|
|
134
|
+
await middleware(mockReq, mockRes, mockNext);
|
|
135
|
+
expect(mockNext).not.toHaveBeenCalled();
|
|
136
|
+
expect(mockRes.status).toHaveBeenCalledWith(401);
|
|
137
|
+
expect(mockRes.json).toHaveBeenCalledWith({
|
|
138
|
+
error: new ProsopoEnvError("API.UNAUTHORIZED", {
|
|
139
|
+
context: { i18n: mockReq.i18n, code: 401 },
|
|
140
|
+
}),
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=authMiddleware.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authMiddleware.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/middlewares/authMiddleware.unit.test.ts"],"names":[],"mappings":"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"}
|
package/express.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright 2021-
|
|
1
|
+
// Copyright 2021-2026 Prosopo (UK) Ltd.
|
|
2
2
|
//
|
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
4
|
// you may not use this file except in compliance with the License.
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
|
|
15
|
-
import type { Logger } from "@prosopo/
|
|
15
|
+
import type { Logger } from "@prosopo/logger";
|
|
16
|
+
import type { IPInfoResponse } from "@prosopo/types";
|
|
16
17
|
import type { TFunction } from "i18next";
|
|
17
18
|
|
|
18
19
|
declare global {
|
|
@@ -27,6 +28,7 @@ declare global {
|
|
|
27
28
|
ja4: string;
|
|
28
29
|
logger: Logger;
|
|
29
30
|
requestId?: string;
|
|
31
|
+
ipInfo?: IPInfoResponse;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
}
|