@t4h.framework/webhook 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/skills/framework-webhook/SKILL.md +16 -7
- package/CHANGELOG.md +45 -0
- package/LICENSE +21 -0
- package/README.md +4 -2
- package/dist/activities/WebhookActivity.d.ts.map +1 -1
- package/dist/activities/WebhookActivity.js +3 -5
- package/dist/activities/WebhookActivity.js.map +1 -1
- package/dist/models/WebhookRequest.d.ts +2 -3
- package/dist/models/WebhookRequest.d.ts.map +1 -1
- package/dist/models/WebhookRequest.js.map +1 -1
- package/dist/webhook.d.ts +0 -4
- package/dist/webhook.d.ts.map +1 -1
- package/dist/webhook.js +0 -4
- package/dist/webhook.js.map +1 -1
- package/package.json +5 -7
- package/dist/tools/callback-token.d.ts +0 -3
- package/dist/tools/callback-token.d.ts.map +0 -1
- package/dist/tools/callback-token.js +0 -14
- package/dist/tools/callback-token.js.map +0 -1
- package/dist/tools/get-header.d.ts +0 -4
- package/dist/tools/get-header.d.ts.map +0 -1
- package/dist/tools/get-header.js +0 -21
- package/dist/tools/get-header.js.map +0 -1
- package/dist/tools/parse-callback-body.d.ts +0 -3
- package/dist/tools/parse-callback-body.d.ts.map +0 -1
- package/dist/tools/parse-callback-body.js +0 -25
- package/dist/tools/parse-callback-body.js.map +0 -1
- package/dist/tools/timing-safe-equal-string.d.ts +0 -2
- package/dist/tools/timing-safe-equal-string.d.ts.map +0 -1
- package/dist/tools/timing-safe-equal-string.js +0 -9
- package/dist/tools/timing-safe-equal-string.js.map +0 -1
- package/dist/tools/verify-callback-auth.d.ts +0 -9
- package/dist/tools/verify-callback-auth.d.ts.map +0 -1
- package/dist/tools/verify-callback-auth.js +0 -89
- package/dist/tools/verify-callback-auth.js.map +0 -1
|
@@ -76,20 +76,29 @@ and returns `pending({ payload: dispatch, schema, auth, timeoutAt })`.
|
|
|
76
76
|
|
|
77
77
|
## Host contract
|
|
78
78
|
|
|
79
|
+
The callbacks route belongs to the core and serves every async activity; the
|
|
80
|
+
helpers below live in the `AsyncActivityCallback` namespace of `@t4h.framework/core`, not
|
|
81
|
+
in this package.
|
|
82
|
+
|
|
79
83
|
1. `GetActivityCallbackUrlClaim.getActivityCallbackUrl()`: absolute `http(s)`
|
|
80
84
|
URL of the current activity's callbacks route with
|
|
81
|
-
`?token=
|
|
82
|
-
2. Callback route: `
|
|
85
|
+
`?token=AsyncActivityCallback.deriveToken(secret, activityId)`. Nothing stored.
|
|
86
|
+
2. Callback route: `AsyncActivityCallback.isTokenValid` **first** (404 if the token was
|
|
83
87
|
never minted) → activity/pending lookup (503 + `Retry-After` if the pending
|
|
84
88
|
is not visible yet: the partner called back before the tick committed) →
|
|
85
|
-
`
|
|
86
|
-
(401) → advance with `
|
|
87
|
-
`{ method, headers: flattenHeaders(headers) }`. 410 when no longer pending,
|
|
89
|
+
`AsyncActivityCallback.authorize(pending.auth, { method, headers, rawBody }, authorizers)`
|
|
90
|
+
(401) → advance with `AsyncActivityCallback.parseBody(contentType, rawBody)` and
|
|
91
|
+
`{ method, headers: AsyncActivityCallback.flattenHeaders(headers) }`. 410 when no longer pending,
|
|
88
92
|
202 otherwise (repeats included).
|
|
89
|
-
3.
|
|
93
|
+
3. `authorizers` is `{ hmac, jwt }` with the default exports of
|
|
94
|
+
`@t4h.framework/hmac/callback` and `@t4h.framework/jwks/callback`; `basic`,
|
|
95
|
+
`header` and `bearer` are built into the core. A declared type without a
|
|
96
|
+
authorizer throws `AsyncActivityCallbackAuthorizerMissingException`.
|
|
97
|
+
4. Verification needs the **raw body**; parse JSON only after it.
|
|
90
98
|
|
|
91
99
|
The dev server implements this in `packages/dev` (`DevGetActivityCallbackUrlClaim`,
|
|
92
|
-
`CallbackTokenService`, `
|
|
100
|
+
`CallbackTokenService`, `CallbackAuthorizersService`,
|
|
101
|
+
`CreateWorkflowRunAsyncActivityPendingCallback`, route
|
|
93
102
|
`POST /projects/:project/workflows/:workflow/runs/:run/activities/:activity/callbacks`).
|
|
94
103
|
|
|
95
104
|
## Testing
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# @t4h.framework/webhook
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#167](https://github.com/tech4humans-brasil/framework/pull/167) [`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Moves the callbacks route helpers from `@t4h.framework/webhook` to
|
|
8
|
+
`@t4h.framework/core`. The route advances any pending async activity, not only
|
|
9
|
+
`webhook()`, and the core already owned its contract (`AsyncActivityCallbackAuth`,
|
|
10
|
+
`GetActivityCallbackUrlClaim`, `AsyncActivityAdvanceContext`).
|
|
11
|
+
|
|
12
|
+
**core**: new `AsyncActivityCallback` namespace with `deriveToken`, `isTokenValid`,
|
|
13
|
+
`parseBody`, `getHeader`, `getBearerToken`, `flattenHeaders`, `authorize` and
|
|
14
|
+
the types `AsyncActivityCallback.Delivery`, `AsyncActivityCallback.Headers`, `AsyncActivityCallback.Json`,
|
|
15
|
+
`AsyncActivityCallback.AuthType`, `AsyncActivityCallback.Authorizer`, `AsyncActivityCallback.Authorizers`.
|
|
16
|
+
`AsyncActivityCallback.authorize(auth, request, authorizers?)` ships `basic`, `header` and
|
|
17
|
+
`bearer`; `hmac` and `jwt` are authorizers the host passes in, so the core does not
|
|
18
|
+
depend on `@t4h.framework/hmac` or `@t4h.framework/jwks`. A declared type without
|
|
19
|
+
a authorizer throws `AsyncActivityCallbackAuthorizerMissingException`; an unknown type throws
|
|
20
|
+
`AsyncActivityCallbackAuthUnsupportedException`.
|
|
21
|
+
|
|
22
|
+
**hmac**: new `@t4h.framework/hmac/callback` entry whose default export is the
|
|
23
|
+
`hmac` callback authorizer, `hmacCallback`.
|
|
24
|
+
|
|
25
|
+
**jwks**: new `@t4h.framework/jwks/callback` entry whose default export is the
|
|
26
|
+
`jwt` callback authorizer, `jwksCallback`.
|
|
27
|
+
|
|
28
|
+
**webhook**: no longer exports `deriveCallbackToken`, `isCallbackTokenValid`,
|
|
29
|
+
`verifyCallbackAuth`, `parseCallbackBody`, `getHeader`, `flattenHeaders` nor
|
|
30
|
+
`CallbackRequest`/`CallbackHeaders`, and no longer depends on `hmac` and `jwks`;
|
|
31
|
+
`WebhookJson` is now an alias of the core `AsyncActivityCallback.Json`. Hosts import the
|
|
32
|
+
helpers from the core `AsyncActivityCallback` namespace and the authorizers from the two entries.
|
|
33
|
+
|
|
34
|
+
**dev**: `@t4h.framework/webhook` becomes an optional peer like the other
|
|
35
|
+
integrations. Only `@t4h.framework/core` is required again, which fixes
|
|
36
|
+
`ERR_MODULE_NOT_FOUND: Cannot find package '@t4h.framework/webhook'` on
|
|
37
|
+
projects that never call `webhook()`. `hmac` and `jwt` callback authorizers are
|
|
38
|
+
loaded from the project when `@t4h.framework/hmac` / `@t4h.framework/jwks` are
|
|
39
|
+
installed; a callback whose declared `auth` needs a missing package answers 500
|
|
40
|
+
naming the package to install.
|
|
41
|
+
|
|
42
|
+
### Patch Changes
|
|
43
|
+
|
|
44
|
+
- Updated dependencies [[`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01), [`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01)]:
|
|
45
|
+
- @t4h.framework/core@0.13.0
|
|
46
|
+
- @t4h.framework/http@0.6.2
|
|
47
|
+
|
|
3
48
|
## 0.1.1
|
|
4
49
|
|
|
5
50
|
### Patch Changes
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Tech for humans
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -38,5 +38,7 @@ Pass `{ wait: false }` as the second argument to send the request without
|
|
|
38
38
|
suspending; you get a handle and call `handle.wait()` later.
|
|
39
39
|
|
|
40
40
|
Hosts implement the core `GetActivityCallbackUrlClaim` and the callbacks
|
|
41
|
-
route
|
|
42
|
-
|
|
41
|
+
route, both defined by `@t4h.framework/core` and shared by every async
|
|
42
|
+
activity; the outbound request goes through `HttpClientRequestClaim` from
|
|
43
|
+
`@t4h.framework/http`. Peer dependencies: `@t4h.framework/core` and
|
|
44
|
+
`@t4h.framework/http`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookActivity.d.ts","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"WebhookActivity.d.ts","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { text } from 'node:stream/consumers';
|
|
2
|
-
import { AsyncActivity, Claim, GetActivityCallbackUrlClaim, History, } from '@t4h.framework/core';
|
|
2
|
+
import { AsyncActivity, AsyncActivityCallback, Claim, GetActivityCallbackUrlClaim, History, } from '@t4h.framework/core';
|
|
3
3
|
import { HttpClientRequestClaim } from '@t4h.framework/http';
|
|
4
4
|
import { WebhookCallbackUrlError } from '../errors/WebhookCallbackUrlError.js';
|
|
5
5
|
import { toWebhookRejectedError } from '../errors/WebhookRejectedError.js';
|
|
6
6
|
import { buildWebhookDispatch } from '../tools/build-webhook-dispatch.js';
|
|
7
|
-
import { flattenHeaders } from '../tools/get-header.js';
|
|
8
|
-
import { parseCallbackBody } from '../tools/parse-callback-body.js';
|
|
9
7
|
const WEBHOOK_ACTIVITY_CLAIMS = Symbol('webhook-activity-claims');
|
|
10
8
|
export const WEBHOOK_DISPATCH_TIMEOUT_IN_MS = 60_000;
|
|
11
9
|
function toCallbackUrl(callbackUrl) {
|
|
@@ -65,7 +63,7 @@ export class WebhookActivity extends AsyncActivity {
|
|
|
65
63
|
retry: true,
|
|
66
64
|
timeoutInMs: WEBHOOK_DISPATCH_TIMEOUT_IN_MS,
|
|
67
65
|
});
|
|
68
|
-
const headers = flattenHeaders(response.headers);
|
|
66
|
+
const headers = AsyncActivityCallback.flattenHeaders(response.headers);
|
|
69
67
|
const rawBody = await text(response.body);
|
|
70
68
|
if (response.status >= 400)
|
|
71
69
|
return {
|
|
@@ -76,7 +74,7 @@ export class WebhookActivity extends AsyncActivity {
|
|
|
76
74
|
return {
|
|
77
75
|
status: response.status,
|
|
78
76
|
headers,
|
|
79
|
-
body:
|
|
77
|
+
body: AsyncActivityCallback.parseBody(headers['content-type'], rawBody),
|
|
80
78
|
};
|
|
81
79
|
}
|
|
82
80
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookActivity.js","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,OAAO,EACL,aAAa,EACb,KAAK,EACL,2BAA2B,EAC3B,OAAO,GAMR,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAQ1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"WebhookActivity.js","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,EACL,2BAA2B,EAC3B,OAAO,GAMR,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAQ1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAgBzE,MAAM,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA;AAEjE,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAA;AAEpD,SAAS,aAAa,CAAC,WAAoB;IACzC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,MAAM;QACxD,MAAM,IAAI,uBAAuB,CAC/B,wDAAwD,EACxD,WAAW,CACZ,CAAA;IAEH,IAAI,GAAQ,CAAA;IAEZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,uBAAuB,CAC/B,iEAAiE,WAAW,EAAE,EAC9E,WAAW,CACZ,CAAA;IACH,CAAC;IAED,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACvD,MAAM,IAAI,uBAAuB,CAC/B,wEAAwE,GAAG,CAAC,QAAQ,EAAE,EACtF,WAAW,CACZ,CAAA;IAEH,OAAO,GAAG,CAAC,IAAI,CAAA;AACjB,CAAC;AAED,MAAM,OAAO,eAEX,SAAQ,aAOT;IACkB,CAAC,uBAAuB,CAAC,GAAG,IAAI,KAAK,CAAC;QACrD,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,2BAA2B;KACtC,CAAC,CAAA;IAEK,OAAO,CAAC,OAAgC;QAC7C,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,KAA2B;QAChD,MAAM,WAAW,GAAG,aAAa,CAC/B,IAAI,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAChE,CAAA;QAED,IAAI,QAA6C,CAAA;QAEjD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;YAE/D,IAAI,QAAQ,IAAI,OAAO;gBAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEtD,QAAQ,GAAG,OAAO,CAAA;QACpB,CAAC;QAED,MAAM,OAAO,GAGT;YACF,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,KAAK,CAAC,MAA6B;YAC3C,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAA;QAED,IAAI,KAAK,CAAC,WAAW;YACnB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;QAE9D,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAuB,EAAE,WAAmB;QACjE,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAE3D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;gBAChE,GAAG,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC1B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EACF,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACtE,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,8BAA8B;aAC5C,CAAC,CAAA;YAEF,MAAM,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAEzC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;gBACxB,OAAO;oBACL,MAAM,EAAE,iBAA0B;oBAClC,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,eAAe,QAAQ,CAAC,GAAG,aAAa,QAAQ,CAAC,MAAM,EAAE;iBACnE,CAAA;YAEH,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO;gBACP,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;aACxE,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,MAAM,EAAE,iBAA0B;gBAClC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,CAAA;QACH,CAAC;IACH,CAAC;IAEM,OAAO,CACZ,OAA6B,EAC7B,SAA0E,EAC1E,OAAqC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM;YACjC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;YAC/B,IAAI,EAAE,OAAkC;YACxC,QAAQ,EAAE,SAAS,CAAC,OAAO;SAC5B,CAAC,CAAA;IACJ,CAAC;IAEM,QAAQ,CACb,MAAqD;QAErD,IAAI,QAAQ,IAAI,MAAM;YAAE,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QAErE,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAA4B;YACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAA;IACH,CAAC;CACF;AAoBD,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,OAAgC,EAChC,EAAE,IAAI,GAAG,IAAI,KAAyB,EAAE;IAExC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACrC,eAAqD,EACrD,OAAO,CACR,CAAA;IAED,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;AACtC,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
};
|
|
1
|
+
import type { AsyncActivityCallback } from '@t4h.framework/core';
|
|
2
|
+
export type WebhookJson = AsyncActivityCallback.Json;
|
|
4
3
|
export type WebhookRequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
5
4
|
export type WebhookRequestBody = {
|
|
6
5
|
json: WebhookJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookRequest.d.ts","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"WebhookRequest.d.ts","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAA;AAEpD,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE9E,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GACnC;IAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElC;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,gCAAgC,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookRequest.js","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WebhookRequest.js","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,gCAAgC,GAAG,iBAAiB,CAAA"}
|
package/dist/webhook.d.ts
CHANGED
|
@@ -4,8 +4,4 @@ export * from './errors/WebhookRejectedError.js';
|
|
|
4
4
|
export * from './models/WebhookCallback.js';
|
|
5
5
|
export * from './models/WebhookRequest.js';
|
|
6
6
|
export * from './tools/build-webhook-dispatch.js';
|
|
7
|
-
export * from './tools/callback-token.js';
|
|
8
|
-
export * from './tools/get-header.js';
|
|
9
|
-
export * from './tools/parse-callback-body.js';
|
|
10
|
-
export * from './tools/verify-callback-auth.js';
|
|
11
7
|
//# sourceMappingURL=webhook.d.ts.map
|
package/dist/webhook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA"}
|
package/dist/webhook.js
CHANGED
|
@@ -4,8 +4,4 @@ export * from './errors/WebhookRejectedError.js';
|
|
|
4
4
|
export * from './models/WebhookCallback.js';
|
|
5
5
|
export * from './models/WebhookRequest.js';
|
|
6
6
|
export * from './tools/build-webhook-dispatch.js';
|
|
7
|
-
export * from './tools/callback-token.js';
|
|
8
|
-
export * from './tools/get-header.js';
|
|
9
|
-
export * from './tools/parse-callback-body.js';
|
|
10
|
-
export * from './tools/verify-callback-auth.js';
|
|
11
7
|
//# sourceMappingURL=webhook.js.map
|
package/dist/webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t4h.framework/webhook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Webhook module for the T4H Framework",
|
|
5
5
|
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/webhook",
|
|
6
6
|
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
|
@@ -31,19 +31,17 @@
|
|
|
31
31
|
"test:watch": "vitest"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@t4h.framework/hmac": "^0.2.2",
|
|
35
|
-
"@t4h.framework/jwks": "^0.5.2",
|
|
36
34
|
"typebox": "^1.1.6"
|
|
37
35
|
},
|
|
38
36
|
"devDependencies": {
|
|
39
|
-
"@t4h.framework/core": "^0.
|
|
40
|
-
"@t4h.framework/http": "^0.6.
|
|
37
|
+
"@t4h.framework/core": "^0.13.0",
|
|
38
|
+
"@t4h.framework/http": "^0.6.2",
|
|
41
39
|
"typescript": "^5.9.3",
|
|
42
40
|
"vitest": "^4.0.18"
|
|
43
41
|
},
|
|
44
42
|
"peerDependencies": {
|
|
45
|
-
"@t4h.framework/core": "^0.
|
|
46
|
-
"@t4h.framework/http": "^0.6.
|
|
43
|
+
"@t4h.framework/core": "^0.13.0",
|
|
44
|
+
"@t4h.framework/http": "^0.6.2"
|
|
47
45
|
},
|
|
48
46
|
"packageManager": "yarn@4.12.0",
|
|
49
47
|
"engines": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"callback-token.d.ts","sourceRoot":"","sources":["../../src/tools/callback-token.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAKrE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,WASd"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
export function deriveCallbackToken(secret, activityId) {
|
|
3
|
-
return crypto
|
|
4
|
-
.createHmac('sha256', secret)
|
|
5
|
-
.update(activityId)
|
|
6
|
-
.digest('base64url');
|
|
7
|
-
}
|
|
8
|
-
export function isCallbackTokenValid(secret, activityId, token) {
|
|
9
|
-
const expected = Buffer.from(deriveCallbackToken(secret, activityId));
|
|
10
|
-
const candidate = Buffer.from(token);
|
|
11
|
-
return (expected.length === candidate.length &&
|
|
12
|
-
crypto.timingSafeEqual(expected, candidate));
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=callback-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"callback-token.js","sourceRoot":"","sources":["../../src/tools/callback-token.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,UAAkB;IACpE,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,UAAkB,EAClB,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEpC,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QACpC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC5C,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export type CallbackHeaders = Record<string, string | string[] | undefined>;
|
|
2
|
-
export declare function getHeader(headers: CallbackHeaders, name: string): string | undefined;
|
|
3
|
-
export declare function flattenHeaders(headers: CallbackHeaders): Record<string, string>;
|
|
4
|
-
//# sourceMappingURL=get-header.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-header.d.ts","sourceRoot":"","sources":["../../src/tools/get-header.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;AAE3E,wBAAgB,SAAS,CACvB,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
|
package/dist/tools/get-header.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function getHeader(headers, name) {
|
|
2
|
-
const wanted = name.toLowerCase();
|
|
3
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
4
|
-
if (key.toLowerCase() !== wanted)
|
|
5
|
-
continue;
|
|
6
|
-
if (Array.isArray(value))
|
|
7
|
-
return value[0];
|
|
8
|
-
return value;
|
|
9
|
-
}
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
export function flattenHeaders(headers) {
|
|
13
|
-
const result = {};
|
|
14
|
-
for (const [name, value] of Object.entries(headers)) {
|
|
15
|
-
if (value === undefined)
|
|
16
|
-
continue;
|
|
17
|
-
result[name.toLowerCase()] = Array.isArray(value) ? value.join(', ') : value;
|
|
18
|
-
}
|
|
19
|
-
return result;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=get-header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-header.js","sourceRoot":"","sources":["../../src/tools/get-header.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CACvB,OAAwB,EACxB,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,SAAQ;QAE1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;QAEzC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAwB;IAExB,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QAEjC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-callback-body.d.ts","sourceRoot":"","sources":["../../src/tools/parse-callback-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAM9D,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,WAAW,GAAG,SAAS,CA2BzB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const JSON_CONTENT_TYPE = /^application\/([\w.-]+\+)?json$/i;
|
|
2
|
-
const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';
|
|
3
|
-
export function parseCallbackBody(contentType, rawBody) {
|
|
4
|
-
if (!rawBody.length)
|
|
5
|
-
return undefined;
|
|
6
|
-
const type = contentType?.split(';')[0]?.trim().toLowerCase() ?? '';
|
|
7
|
-
if (JSON_CONTENT_TYPE.test(type))
|
|
8
|
-
try {
|
|
9
|
-
return JSON.parse(rawBody);
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return rawBody;
|
|
13
|
-
}
|
|
14
|
-
if (type === FORM_CONTENT_TYPE) {
|
|
15
|
-
const params = new URLSearchParams(rawBody);
|
|
16
|
-
const result = {};
|
|
17
|
-
for (const key of new Set(params.keys())) {
|
|
18
|
-
const values = params.getAll(key);
|
|
19
|
-
result[key] = values.length === 1 ? values[0] : values;
|
|
20
|
-
}
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
return rawBody;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=parse-callback-body.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-callback-body.js","sourceRoot":"","sources":["../../src/tools/parse-callback-body.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,kCAAkC,CAAA;AAE5D,MAAM,iBAAiB,GAAG,mCAAmC,CAAA;AAE7D,MAAM,UAAU,iBAAiB,CAC/B,WAA+B,EAC/B,OAAe;IAEf,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAEnE,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAA;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAA;QAChB,CAAC;IAEH,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;QAE3C,MAAM,MAAM,GAAgC,EAAE,CAAA;QAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAEjC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QACzD,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timing-safe-equal-string.d.ts","sourceRoot":"","sources":["../../src/tools/timing-safe-equal-string.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAOxE"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
export function timingSafeEqualString(expected, candidate) {
|
|
3
|
-
const a = Buffer.from(expected, 'utf8');
|
|
4
|
-
const b = Buffer.from(candidate, 'utf8');
|
|
5
|
-
if (a.length !== b.length)
|
|
6
|
-
return false;
|
|
7
|
-
return crypto.timingSafeEqual(a, b);
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=timing-safe-equal-string.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timing-safe-equal-string.js","sourceRoot":"","sources":["../../src/tools/timing-safe-equal-string.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;IACvE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAExC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEvC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { AsyncActivityCallbackAuth } from '@t4h.framework/core';
|
|
2
|
-
import { type CallbackHeaders } from './get-header.js';
|
|
3
|
-
export interface CallbackRequest {
|
|
4
|
-
method: string;
|
|
5
|
-
headers: CallbackHeaders;
|
|
6
|
-
rawBody: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function verifyCallbackAuth(auth: AsyncActivityCallbackAuth | undefined, request: CallbackRequest): Promise<boolean>;
|
|
9
|
-
//# sourceMappingURL=verify-callback-auth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-callback-auth.d.ts","sourceRoot":"","sources":["../../src/tools/verify-callback-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAM1B,MAAM,qBAAqB,CAAA;AAI5B,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB;AAuGD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,GAAG,SAAS,EAC3C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import hmac from '@t4h.framework/hmac/authorize';
|
|
2
|
-
import jwks from '@t4h.framework/jwks/authorize';
|
|
3
|
-
import { getHeader } from './get-header.js';
|
|
4
|
-
import { timingSafeEqualString } from './timing-safe-equal-string.js';
|
|
5
|
-
const BEARER = /^Bearer\s+(.+)$/i;
|
|
6
|
-
function getBearerToken(headers, name = 'authorization') {
|
|
7
|
-
const value = getHeader(headers, name);
|
|
8
|
-
if (!value)
|
|
9
|
-
return undefined;
|
|
10
|
-
return BEARER.exec(value)?.[1]?.trim();
|
|
11
|
-
}
|
|
12
|
-
function verifyHmac(auth, request) {
|
|
13
|
-
const signature = getHeader(request.headers, auth.header);
|
|
14
|
-
if (!signature)
|
|
15
|
-
return false;
|
|
16
|
-
const timestamp = auth.timestampHeader
|
|
17
|
-
? getHeader(request.headers, auth.timestampHeader)
|
|
18
|
-
: undefined;
|
|
19
|
-
if (auth.timestampHeader && !timestamp)
|
|
20
|
-
return false;
|
|
21
|
-
const rawPayload = (auth.signedPayload ?? '{body}')
|
|
22
|
-
.replaceAll('{timestamp}', timestamp ?? '')
|
|
23
|
-
.replaceAll('{body}', request.rawBody);
|
|
24
|
-
return hmac({
|
|
25
|
-
secret: auth.secret,
|
|
26
|
-
signature,
|
|
27
|
-
rawPayload,
|
|
28
|
-
algorithm: auth.algorithm,
|
|
29
|
-
signatureFormat: auth.signatureFormat,
|
|
30
|
-
signaturePrefix: auth.signaturePrefix,
|
|
31
|
-
timestamp,
|
|
32
|
-
toleranceInSeconds: auth.toleranceInSeconds,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
function verifyBasic(auth, request) {
|
|
36
|
-
const value = getHeader(request.headers, 'authorization');
|
|
37
|
-
if (!value)
|
|
38
|
-
return false;
|
|
39
|
-
const expected = `Basic ${Buffer.from(`${auth.username}:${auth.password}`).toString('base64')}`;
|
|
40
|
-
return timingSafeEqualString(expected, value);
|
|
41
|
-
}
|
|
42
|
-
function verifyHeader(auth, request) {
|
|
43
|
-
const value = getHeader(request.headers, auth.name);
|
|
44
|
-
if (!value)
|
|
45
|
-
return false;
|
|
46
|
-
return timingSafeEqualString(auth.value, value);
|
|
47
|
-
}
|
|
48
|
-
function verifyBearer(auth, request) {
|
|
49
|
-
const token = getBearerToken(request.headers);
|
|
50
|
-
if (!token)
|
|
51
|
-
return false;
|
|
52
|
-
return timingSafeEqualString(auth.token, token);
|
|
53
|
-
}
|
|
54
|
-
async function verifyJwt(auth, request) {
|
|
55
|
-
const token = getBearerToken(request.headers, auth.header);
|
|
56
|
-
if (!token)
|
|
57
|
-
return false;
|
|
58
|
-
try {
|
|
59
|
-
return await jwks({
|
|
60
|
-
url: auth.jwksUri,
|
|
61
|
-
signature: token,
|
|
62
|
-
rawPayload: '',
|
|
63
|
-
issuer: auth.issuer,
|
|
64
|
-
audience: auth.audience,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export async function verifyCallbackAuth(auth, request) {
|
|
72
|
-
if (!auth)
|
|
73
|
-
return true;
|
|
74
|
-
switch (auth.type) {
|
|
75
|
-
case 'hmac':
|
|
76
|
-
return verifyHmac(auth, request);
|
|
77
|
-
case 'basic':
|
|
78
|
-
return verifyBasic(auth, request);
|
|
79
|
-
case 'header':
|
|
80
|
-
return verifyHeader(auth, request);
|
|
81
|
-
case 'bearer':
|
|
82
|
-
return verifyBearer(auth, request);
|
|
83
|
-
case 'jwt':
|
|
84
|
-
return verifyJwt(auth, request);
|
|
85
|
-
default:
|
|
86
|
-
throw new TypeError(`Unsupported callback auth type: ${String(auth.type)}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=verify-callback-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-callback-auth.js","sourceRoot":"","sources":["../../src/tools/verify-callback-auth.ts"],"names":[],"mappings":"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"}
|