@pisti-paypiller/backend 0.0.0-stage → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +133 -2
- package/dist/errors.d.ts +6 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/keys.d.ts +12 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +45 -0
- package/dist/keys.js.map +1 -0
- package/dist/management-types.d.ts +311 -0
- package/dist/management-types.d.ts.map +1 -0
- package/dist/management-types.js +2 -0
- package/dist/management-types.js.map +1 -0
- package/dist/management.d.ts +162 -0
- package/dist/management.d.ts.map +1 -0
- package/dist/management.js +432 -0
- package/dist/management.js.map +1 -0
- package/dist/tokens.d.ts +43 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +458 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +170 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks.d.ts +94 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +117 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +43 -4
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/** The verified claims of a Pisti session token. */
|
|
2
|
+
export interface SessionClaims {
|
|
3
|
+
/** The user's ID. */
|
|
4
|
+
sub: string;
|
|
5
|
+
/** The session's ID. */
|
|
6
|
+
sid: string;
|
|
7
|
+
iss: string;
|
|
8
|
+
aud: string | string[];
|
|
9
|
+
exp: number;
|
|
10
|
+
iat: number;
|
|
11
|
+
nbf?: number;
|
|
12
|
+
/** The origin the token was issued to. */
|
|
13
|
+
azp?: string;
|
|
14
|
+
instance_id: string;
|
|
15
|
+
/** The environment's Frontend API id. */
|
|
16
|
+
fid: string;
|
|
17
|
+
email?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
auth_time?: number;
|
|
20
|
+
mfa_authenticated_at?: number;
|
|
21
|
+
org_id?: string;
|
|
22
|
+
org_slug?: string;
|
|
23
|
+
org_role?: string;
|
|
24
|
+
org_permissions?: string[];
|
|
25
|
+
[claim: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
export type ReverificationLevel = "first_factor" | "second_factor" | "multi_factor";
|
|
28
|
+
export interface CheckAuthorizationParams {
|
|
29
|
+
permission?: string | undefined;
|
|
30
|
+
role?: string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Require a recent verification, like Clerk: "strict_mfa" (both factors within 10 minutes),
|
|
33
|
+
* "strict" (second factor, or the first for users without one, within 10 minutes), "moderate"
|
|
34
|
+
* (60 minutes), "lax" (a day), or `{ level, afterMinutes }`.
|
|
35
|
+
*/
|
|
36
|
+
reverification?: "strict_mfa" | "strict" | "moderate" | "lax" | {
|
|
37
|
+
level: ReverificationLevel;
|
|
38
|
+
afterMinutes: number;
|
|
39
|
+
} | undefined;
|
|
40
|
+
}
|
|
41
|
+
interface AuthObjectBase {
|
|
42
|
+
tokenType: "session_token";
|
|
43
|
+
/** True when the active organization grants this permission or role, or the sign-in is recent enough. */
|
|
44
|
+
has(params: CheckAuthorizationParams): boolean;
|
|
45
|
+
/** The raw session token, for forwarding to another service. */
|
|
46
|
+
getToken(): Promise<string | null>;
|
|
47
|
+
}
|
|
48
|
+
export interface SignedInAuthObject extends AuthObjectBase {
|
|
49
|
+
isAuthenticated: true;
|
|
50
|
+
userId: string;
|
|
51
|
+
sessionId: string;
|
|
52
|
+
sessionStatus: "active";
|
|
53
|
+
sessionClaims: SessionClaims;
|
|
54
|
+
/** The active organization, or null for the user's personal account. */
|
|
55
|
+
orgId: string | null;
|
|
56
|
+
orgSlug: string | null;
|
|
57
|
+
orgRole: string | null;
|
|
58
|
+
orgPermissions: string[] | null;
|
|
59
|
+
/** Minutes since the first and second factor were verified; -1 when never in this session. */
|
|
60
|
+
factorVerificationAge: [number, number];
|
|
61
|
+
}
|
|
62
|
+
export interface SignedOutAuthObject extends AuthObjectBase {
|
|
63
|
+
isAuthenticated: false;
|
|
64
|
+
userId: null;
|
|
65
|
+
sessionId: null;
|
|
66
|
+
sessionStatus: null;
|
|
67
|
+
sessionClaims: null;
|
|
68
|
+
orgId: null;
|
|
69
|
+
orgSlug: null;
|
|
70
|
+
orgRole: null;
|
|
71
|
+
orgPermissions: null;
|
|
72
|
+
factorVerificationAge: null;
|
|
73
|
+
}
|
|
74
|
+
/** Who is making a request. Narrow it with `isAuthenticated`. */
|
|
75
|
+
export type AuthObject = SignedInAuthObject | SignedOutAuthObject;
|
|
76
|
+
/** The kinds of token a request can carry, like Clerk's `acceptsToken`. */
|
|
77
|
+
export type TokenType = "session_token" | "api_key" | "m2m_token" | "oauth_token";
|
|
78
|
+
export type AcceptsToken = TokenType | readonly TokenType[] | "any";
|
|
79
|
+
/** An end user's API key, verified with the backend API (needs the secret key). */
|
|
80
|
+
export interface AuthenticatedApiKey {
|
|
81
|
+
isAuthenticated: true;
|
|
82
|
+
tokenType: "api_key";
|
|
83
|
+
id: string;
|
|
84
|
+
name: string;
|
|
85
|
+
/** The user who owns the key. */
|
|
86
|
+
subject: string;
|
|
87
|
+
userId: string;
|
|
88
|
+
scopes: string[];
|
|
89
|
+
claims: Record<string, unknown> | null;
|
|
90
|
+
getToken(): Promise<string>;
|
|
91
|
+
}
|
|
92
|
+
/** A machine-to-machine token from a confidential OAuth application's client credentials. */
|
|
93
|
+
export interface AuthenticatedM2MToken {
|
|
94
|
+
isAuthenticated: true;
|
|
95
|
+
tokenType: "m2m_token";
|
|
96
|
+
id: string | null;
|
|
97
|
+
/** The OAuth application's client ID. */
|
|
98
|
+
subject: string;
|
|
99
|
+
machineId: string;
|
|
100
|
+
scopes: string[];
|
|
101
|
+
claims: Record<string, unknown>;
|
|
102
|
+
getToken(): Promise<string>;
|
|
103
|
+
}
|
|
104
|
+
/** An OAuth access token Pisti issued to an OAuth application on a user's behalf. */
|
|
105
|
+
export interface AuthenticatedOAuthToken {
|
|
106
|
+
isAuthenticated: true;
|
|
107
|
+
tokenType: "oauth_token";
|
|
108
|
+
id: string | null;
|
|
109
|
+
subject: string;
|
|
110
|
+
userId: string;
|
|
111
|
+
clientId: string | null;
|
|
112
|
+
scopes: string[];
|
|
113
|
+
claims: Record<string, unknown>;
|
|
114
|
+
getToken(): Promise<string>;
|
|
115
|
+
}
|
|
116
|
+
export interface UnauthenticatedMachineObject<T extends Exclude<TokenType, "session_token">> {
|
|
117
|
+
isAuthenticated: false;
|
|
118
|
+
tokenType: T;
|
|
119
|
+
id: null;
|
|
120
|
+
subject: null;
|
|
121
|
+
userId: null;
|
|
122
|
+
scopes: null;
|
|
123
|
+
claims: null;
|
|
124
|
+
getToken(): Promise<null>;
|
|
125
|
+
}
|
|
126
|
+
export type ApiKeyAuthObject = AuthenticatedApiKey | UnauthenticatedMachineObject<"api_key">;
|
|
127
|
+
export type M2MAuthObject = AuthenticatedM2MToken | UnauthenticatedMachineObject<"m2m_token">;
|
|
128
|
+
export type OAuthAuthObject = AuthenticatedOAuthToken | UnauthenticatedMachineObject<"oauth_token">;
|
|
129
|
+
/** Any auth object; narrow it with `tokenType` and `isAuthenticated`. */
|
|
130
|
+
export type AnyAuthObject = AuthObject | ApiKeyAuthObject | M2MAuthObject | OAuthAuthObject;
|
|
131
|
+
type AuthObjectOf<T extends TokenType> = T extends "session_token" ? AuthObject : T extends "api_key" ? ApiKeyAuthObject : T extends "m2m_token" ? M2MAuthObject : OAuthAuthObject;
|
|
132
|
+
/** The auth object a given `acceptsToken` can produce. */
|
|
133
|
+
export type AuthObjectFor<T extends AcceptsToken> = T extends "any" ? AnyAuthObject : T extends readonly TokenType[] ? AuthObjectOf<T[number]> : T extends TokenType ? AuthObjectOf<T> : never;
|
|
134
|
+
export interface RequestState<T extends AnyAuthObject = AnyAuthObject> {
|
|
135
|
+
isAuthenticated: boolean;
|
|
136
|
+
/**
|
|
137
|
+
* "handshake" means the session cookie expired on a page request: send the response described by
|
|
138
|
+
* `headers` (a redirect through Pisti that refreshes the cookie) instead of rendering.
|
|
139
|
+
*/
|
|
140
|
+
status: "signed-in" | "signed-out" | "handshake";
|
|
141
|
+
/** Why the request is signed out or needs a handshake, for logging; null when signed in. */
|
|
142
|
+
reason: string | null;
|
|
143
|
+
message: string | null;
|
|
144
|
+
token: string | null;
|
|
145
|
+
tokenType: TokenType | null;
|
|
146
|
+
/** Headers to send: `Location` and `Set-Cookie` during a handshake. */
|
|
147
|
+
headers: Headers;
|
|
148
|
+
toAuth(): T;
|
|
149
|
+
}
|
|
150
|
+
export interface VerifyTokenOptions {
|
|
151
|
+
/** Defaults to `PISTI_PUBLISHABLE_KEY`. */
|
|
152
|
+
publishableKey?: string | undefined;
|
|
153
|
+
/** Origins allowed to have requested the token (`azp`). Defaults to `PISTI_AUTHORIZED_PARTIES` (comma-separated). */
|
|
154
|
+
authorizedParties?: string[] | undefined;
|
|
155
|
+
/**
|
|
156
|
+
* The PEM public key from the console (API keys → JWT public key) or `client.getInstance()`.
|
|
157
|
+
* Verifies tokens without fetching signing keys. Defaults to `PISTI_JWT_KEY`.
|
|
158
|
+
*/
|
|
159
|
+
jwtKey?: string | undefined;
|
|
160
|
+
}
|
|
161
|
+
export interface AuthenticateRequestOptions extends VerifyTokenOptions {
|
|
162
|
+
/** Which tokens to accept. Defaults to "session_token". */
|
|
163
|
+
acceptsToken?: AcceptsToken | undefined;
|
|
164
|
+
/** Verifies API keys. Defaults to `PISTI_SECRET_KEY`. */
|
|
165
|
+
secretKey?: string | undefined;
|
|
166
|
+
/** Cookie the React SDK writes. Defaults to `__session`. */
|
|
167
|
+
cookieName?: string | undefined;
|
|
168
|
+
}
|
|
169
|
+
export {};
|
|
170
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event data. Pisti sends thin events: the changed resource's id and how to find it. Read the
|
|
3
|
+
* current state with the backend API, for example `pistiClient.users.getUser(event.data.id)`.
|
|
4
|
+
*/
|
|
5
|
+
export interface UserEventData {
|
|
6
|
+
object: "user";
|
|
7
|
+
id: string;
|
|
8
|
+
deleted: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface SessionEventData {
|
|
11
|
+
object: "session";
|
|
12
|
+
id: string;
|
|
13
|
+
user_id: string;
|
|
14
|
+
}
|
|
15
|
+
export interface OrganizationEventData {
|
|
16
|
+
object: "organization";
|
|
17
|
+
id: string;
|
|
18
|
+
deleted: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface OrganizationMembershipEventData {
|
|
21
|
+
object: "organization_membership";
|
|
22
|
+
id: string;
|
|
23
|
+
organization_id: string;
|
|
24
|
+
user_id: string;
|
|
25
|
+
}
|
|
26
|
+
export interface OrganizationInvitationEventData {
|
|
27
|
+
object: "organization_invitation";
|
|
28
|
+
id: string;
|
|
29
|
+
organization_id: string;
|
|
30
|
+
status: string;
|
|
31
|
+
}
|
|
32
|
+
interface WebhookEventDataMap {
|
|
33
|
+
"user.created": UserEventData;
|
|
34
|
+
"user.updated": UserEventData;
|
|
35
|
+
"user.deleted": UserEventData;
|
|
36
|
+
"session.created": SessionEventData;
|
|
37
|
+
"session.ended": SessionEventData;
|
|
38
|
+
"organization.created": OrganizationEventData;
|
|
39
|
+
"organization.updated": OrganizationEventData;
|
|
40
|
+
"organization.deleted": OrganizationEventData;
|
|
41
|
+
"organizationMembership.created": OrganizationMembershipEventData;
|
|
42
|
+
"organizationMembership.updated": OrganizationMembershipEventData;
|
|
43
|
+
"organizationMembership.deleted": OrganizationMembershipEventData;
|
|
44
|
+
"organizationInvitation.created": OrganizationInvitationEventData;
|
|
45
|
+
"organizationInvitation.updated": OrganizationInvitationEventData;
|
|
46
|
+
"organizationInvitation.accepted": OrganizationInvitationEventData;
|
|
47
|
+
"organizationInvitation.revoked": OrganizationInvitationEventData;
|
|
48
|
+
"organizationInvitation.expired": OrganizationInvitationEventData;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A verified webhook event, like Clerk's `WebhookEvent`. Checking `event.type` narrows `event.data`:
|
|
52
|
+
*
|
|
53
|
+
* ```ts
|
|
54
|
+
* if (event.type === "organizationMembership.created") console.log(event.data.organization_id);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export type PistiWebhookEvent = {
|
|
58
|
+
[K in keyof WebhookEventDataMap]: {
|
|
59
|
+
id: string;
|
|
60
|
+
object: "event";
|
|
61
|
+
type: K;
|
|
62
|
+
timestamp: number;
|
|
63
|
+
instance_id: string;
|
|
64
|
+
data: WebhookEventDataMap[K];
|
|
65
|
+
};
|
|
66
|
+
}[keyof WebhookEventDataMap];
|
|
67
|
+
export interface VerifyWebhookOptions {
|
|
68
|
+
/** Defaults to the `PISTI_WEBHOOK_SIGNING_SECRET` environment variable. Pass several while rotating. */
|
|
69
|
+
signingSecret?: string | readonly string[] | undefined;
|
|
70
|
+
/** Optionally require events from this environment (see `client.getInstance()`). */
|
|
71
|
+
expectedInstanceId?: string | undefined;
|
|
72
|
+
/** Clock tolerance for the signed delivery timestamp. Defaults to five minutes. */
|
|
73
|
+
toleranceSeconds?: number;
|
|
74
|
+
}
|
|
75
|
+
type WebhookHeaders = Headers | Readonly<Record<string, string | readonly string[] | undefined>>;
|
|
76
|
+
export declare class PistiWebhookError extends Error {
|
|
77
|
+
readonly code: "invalid_headers" | "invalid_timestamp" | "invalid_signature" | "invalid_payload";
|
|
78
|
+
constructor(code: "invalid_headers" | "invalid_timestamp" | "invalid_signature" | "invalid_payload");
|
|
79
|
+
}
|
|
80
|
+
/** Verify the exact raw body before parsing JSON. Store event IDs to prevent duplicate processing. */
|
|
81
|
+
interface NodeWebhookRequest {
|
|
82
|
+
body: unknown;
|
|
83
|
+
headers: WebhookHeaders;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Verifies a webhook delivery and returns the event, like Clerk's `verifyWebhook`. Pass a Fetch API
|
|
87
|
+
* `Request` (Next.js, Hono, Bun, Workers) or a Node request whose body is the raw bytes. The
|
|
88
|
+
* signing secret defaults to `PISTI_WEBHOOK_SIGNING_SECRET`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function verifyWebhook(request: Request | NodeWebhookRequest, options?: VerifyWebhookOptions): Promise<PistiWebhookEvent>;
|
|
91
|
+
/** Verifies a raw payload and its headers, for frameworks without a Fetch `Request`. */
|
|
92
|
+
export declare function verifyWebhookPayload(payload: string | Uint8Array, headers: WebhookHeaders, options?: VerifyWebhookOptions): PistiWebhookEvent;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
export class PistiWebhookError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code) {
|
|
5
|
+
super("The webhook could not be verified.");
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = "PistiWebhookError";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function header(headers, name, multiple = false) {
|
|
11
|
+
const input = typeof headers.get === "function"
|
|
12
|
+
? headers.get(name)
|
|
13
|
+
: Object.entries(headers).find(([key]) => key.toLowerCase() === name)?.[1];
|
|
14
|
+
if (typeof input === "string" && input.length <= 4096)
|
|
15
|
+
return input;
|
|
16
|
+
if (multiple &&
|
|
17
|
+
Array.isArray(input) &&
|
|
18
|
+
input.length <= 16 &&
|
|
19
|
+
input.every((value) => typeof value === "string" && value.length <= 256))
|
|
20
|
+
return input.join(" ");
|
|
21
|
+
throw new PistiWebhookError("invalid_headers");
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Verifies a webhook delivery and returns the event, like Clerk's `verifyWebhook`. Pass a Fetch API
|
|
25
|
+
* `Request` (Next.js, Hono, Bun, Workers) or a Node request whose body is the raw bytes. The
|
|
26
|
+
* signing secret defaults to `PISTI_WEBHOOK_SIGNING_SECRET`.
|
|
27
|
+
*/
|
|
28
|
+
export async function verifyWebhook(request, options = {}) {
|
|
29
|
+
if (typeof Request !== "undefined" && request instanceof Request)
|
|
30
|
+
return verifyWebhookPayload(new Uint8Array(await request.arrayBuffer()), request.headers, options);
|
|
31
|
+
const { body, headers } = request;
|
|
32
|
+
if (typeof body !== "string" && !(body instanceof Uint8Array))
|
|
33
|
+
throw new Error("The webhook body was already parsed. Read the raw body on this route, for example express.raw({ type: \"application/json\" }) before express.json().");
|
|
34
|
+
return verifyWebhookPayload(body, headers, options);
|
|
35
|
+
}
|
|
36
|
+
/** Verifies a raw payload and its headers, for frameworks without a Fetch `Request`. */
|
|
37
|
+
export function verifyWebhookPayload(payload, headers, options = {}) {
|
|
38
|
+
return verifyPayload(payload, headers, options);
|
|
39
|
+
}
|
|
40
|
+
function verifyPayload(payload, headers, options) {
|
|
41
|
+
const length = typeof payload === "string"
|
|
42
|
+
? Buffer.byteLength(payload, "utf8")
|
|
43
|
+
: payload.byteLength;
|
|
44
|
+
if (length === 0 || length > 262144)
|
|
45
|
+
throw new PistiWebhookError("invalid_payload");
|
|
46
|
+
const body = typeof payload === "string"
|
|
47
|
+
? Buffer.from(payload, "utf8")
|
|
48
|
+
: Buffer.from(payload);
|
|
49
|
+
if (options.expectedInstanceId !== undefined && !/^[1-9]\d{0,9}$/.test(options.expectedInstanceId))
|
|
50
|
+
throw new Error("expectedInstanceId must be the environment's numeric ID.");
|
|
51
|
+
const tolerance = options.toleranceSeconds ?? 300;
|
|
52
|
+
if (!Number.isInteger(tolerance) || tolerance < 1 || tolerance > 600)
|
|
53
|
+
throw new Error("Use a webhook clock tolerance between 1 and 600 seconds.");
|
|
54
|
+
const configured = options.signingSecret ?? process.env.PISTI_WEBHOOK_SIGNING_SECRET;
|
|
55
|
+
if (!configured)
|
|
56
|
+
throw new Error("Missing webhook signing secret. Copy it from the endpoint under Webhooks in the Pisti console into PISTI_WEBHOOK_SIGNING_SECRET.");
|
|
57
|
+
const secrets = typeof configured === "string" ? [configured] : configured;
|
|
58
|
+
if (secrets.length === 0 || secrets.length > 5)
|
|
59
|
+
throw new Error("Provide between one and five webhook signing secrets.");
|
|
60
|
+
const keys = secrets.map((secret) => {
|
|
61
|
+
if (!/^whsec_[A-Za-z0-9+/]{43}=$/.test(secret))
|
|
62
|
+
throw new Error("Provide a Pisti webhook signing secret.");
|
|
63
|
+
return Buffer.from(secret.slice(6), "base64");
|
|
64
|
+
});
|
|
65
|
+
const id = header(headers, "webhook-id"), timestamp = header(headers, "webhook-timestamp");
|
|
66
|
+
if (!/^evt_[a-f0-9]{32}$/.test(id) || !/^\d{1,12}$/.test(timestamp))
|
|
67
|
+
throw new PistiWebhookError("invalid_headers");
|
|
68
|
+
const seconds = Number(timestamp);
|
|
69
|
+
if (Math.abs(Math.floor(Date.now() / 1000) - seconds) > tolerance)
|
|
70
|
+
throw new PistiWebhookError("invalid_timestamp");
|
|
71
|
+
const supplied = header(headers, "webhook-signature", true)
|
|
72
|
+
.split(/\s+/)
|
|
73
|
+
.filter(Boolean);
|
|
74
|
+
if (supplied.length === 0 || supplied.length > 16)
|
|
75
|
+
throw new PistiWebhookError("invalid_signature");
|
|
76
|
+
let verified = false;
|
|
77
|
+
for (const key of keys) {
|
|
78
|
+
const expected = createHmac("sha256", key)
|
|
79
|
+
.update(id + "." + timestamp + ".")
|
|
80
|
+
.update(body)
|
|
81
|
+
.digest();
|
|
82
|
+
for (const signature of supplied) {
|
|
83
|
+
if (!/^v1,[A-Za-z0-9+/]{43}=$/.test(signature))
|
|
84
|
+
continue;
|
|
85
|
+
const value = Buffer.from(signature.slice(3), "base64");
|
|
86
|
+
if (value.length === expected.length &&
|
|
87
|
+
timingSafeEqual(value, expected))
|
|
88
|
+
verified = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (!verified)
|
|
92
|
+
throw new PistiWebhookError("invalid_signature");
|
|
93
|
+
let data;
|
|
94
|
+
try {
|
|
95
|
+
data = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(body));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
throw new PistiWebhookError("invalid_payload");
|
|
99
|
+
}
|
|
100
|
+
if (!data || typeof data !== "object" || Array.isArray(data))
|
|
101
|
+
throw new PistiWebhookError("invalid_payload");
|
|
102
|
+
const event = data;
|
|
103
|
+
if (event.id !== id ||
|
|
104
|
+
event.object !== "event" ||
|
|
105
|
+
(options.expectedInstanceId !== undefined && event.instance_id !== options.expectedInstanceId) ||
|
|
106
|
+
typeof event.type !== "string" ||
|
|
107
|
+
event.type.length === 0 ||
|
|
108
|
+
event.type.length > 100 ||
|
|
109
|
+
!Number.isSafeInteger(event.timestamp) ||
|
|
110
|
+
event.timestamp < 0 ||
|
|
111
|
+
!event.data ||
|
|
112
|
+
typeof event.data !== "object" ||
|
|
113
|
+
Array.isArray(event.data))
|
|
114
|
+
throw new PistiWebhookError("invalid_payload");
|
|
115
|
+
return event;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pisti-paypiller/backend",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.7.1",
|
|
4
|
+
"description": "Pisti backend SDK: verify session tokens, authenticate Fetch API requests, the management API and webhooks. Framework-agnostic.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/pisti-paypiller/pisti-sdks.git",
|
|
10
|
+
"directory": "backend"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=22.12.0"
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./webhooks": {
|
|
24
|
+
"types": "./dist/webhooks.d.ts",
|
|
25
|
+
"import": "./dist/webhooks.js"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"README.md"
|
|
31
|
+
],
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsc -p tsconfig.json",
|
|
35
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
36
|
+
"prepack": "npm run build"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"jose": "6.2.13"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "26.6.5",
|
|
43
|
+
"typescript": "7.0.2"
|
|
44
|
+
}
|
|
45
|
+
}
|