Webhooks signature verification middleware

This commit is contained in:
Tomasz Magulski 2022-07-06 16:03:35 +02:00
parent dc0082b1e0
commit cc13260ef6
4 changed files with 236 additions and 136 deletions

View file

@ -17,14 +17,16 @@
"dependencies": {
"fast-glob": "^3.2.11",
"graphql": "^16.5.0",
"retes": "^0.27.1"
"jose": "^4.8.3",
"retes": "^0.29.4"
},
"devDependencies": {
"@types/node": "^17.0.36",
"@types/node": "^17.0.45",
"clean-publish": "^4.0.1",
"tsm": "^2.2.1",
"tsup": "^6.0.1",
"typescript": "^4.7.2",
"uvu": "^0.5.3",
"tsup": "^6.1.3",
"typescript": "^4.7.4",
"uvu": "^0.5.6",
"watchlist": "^0.3.1"
},
"exports": {

View file

@ -1,27 +1,31 @@
lockfileVersion: 5.4
specifiers:
'@types/node': ^17.0.36
'@types/node': ^17.0.45
clean-publish: ^4.0.1
fast-glob: ^3.2.11
graphql: ^16.5.0
retes: ^0.27.1
jose: ^4.8.3
retes: ^0.29.4
tsm: ^2.2.1
tsup: ^6.0.1
typescript: ^4.7.2
uvu: ^0.5.3
tsup: ^6.1.3
typescript: ^4.7.4
uvu: ^0.5.6
watchlist: ^0.3.1
dependencies:
fast-glob: 3.2.11
graphql: 16.5.0
retes: 0.27.1
jose: 4.8.3
retes: 0.29.4
devDependencies:
'@types/node': 17.0.36
'@types/node': 17.0.45
clean-publish: 4.0.1
tsm: 2.2.1
tsup: 6.0.1_typescript@4.7.2
typescript: 4.7.2
uvu: 0.5.3
tsup: 6.1.3_typescript@4.7.4
typescript: 4.7.4
uvu: 0.5.6
watchlist: 0.3.1
packages:
@ -44,8 +48,8 @@ packages:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.13.0
/@types/node/17.0.36:
resolution: {integrity: sha512-V3orv+ggDsWVHP99K3JlwtH20R7J4IhI1Kksgc+64q5VxgfRkQG8Ws3MFm/FZOKDYGy9feGFlZ70/HpCNe9QaA==}
/@types/node/17.0.45:
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
dev: true
/any-promise/1.3.0:
@ -87,13 +91,13 @@ packages:
dependencies:
fill-range: 7.0.1
/bundle-require/3.0.4_esbuild@0.14.42:
/bundle-require/3.0.4_esbuild@0.14.48:
resolution: {integrity: sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
peerDependencies:
esbuild: '>=0.13'
dependencies:
esbuild: 0.14.42
esbuild: 0.14.48
load-tsconfig: 0.2.3
dev: true
@ -124,6 +128,17 @@ packages:
fsevents: 2.3.2
dev: true
/clean-publish/4.0.1:
resolution: {integrity: sha512-6v0bh5kQD5FDlxBgXDVNNc6KmAB7iIP/GHD91q9xsGVZT5XB9Y8TNqB7dL5u9PTZlBeLpBw+A1AseRlEEJLSWA==}
engines: {node: '>= 16.0.0'}
hasBin: true
dependencies:
cross-spawn: 7.0.3
fast-glob: 3.2.11
lilconfig: 2.0.5
micromatch: 4.0.5
dev: true
/commander/4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
@ -171,8 +186,8 @@ packages:
path-type: 4.0.0
dev: true
/esbuild-android-64/0.14.42:
resolution: {integrity: sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A==}
/esbuild-android-64/0.14.48:
resolution: {integrity: sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==}
engines: {node: '>=12'}
cpu: [x64]
os: [android]
@ -180,8 +195,8 @@ packages:
dev: true
optional: true
/esbuild-android-arm64/0.14.42:
resolution: {integrity: sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg==}
/esbuild-android-arm64/0.14.48:
resolution: {integrity: sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [android]
@ -189,8 +204,8 @@ packages:
dev: true
optional: true
/esbuild-darwin-64/0.14.42:
resolution: {integrity: sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA==}
/esbuild-darwin-64/0.14.48:
resolution: {integrity: sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
@ -198,8 +213,8 @@ packages:
dev: true
optional: true
/esbuild-darwin-arm64/0.14.42:
resolution: {integrity: sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA==}
/esbuild-darwin-arm64/0.14.48:
resolution: {integrity: sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
@ -207,8 +222,8 @@ packages:
dev: true
optional: true
/esbuild-freebsd-64/0.14.42:
resolution: {integrity: sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw==}
/esbuild-freebsd-64/0.14.48:
resolution: {integrity: sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==}
engines: {node: '>=12'}
cpu: [x64]
os: [freebsd]
@ -216,8 +231,8 @@ packages:
dev: true
optional: true
/esbuild-freebsd-arm64/0.14.42:
resolution: {integrity: sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA==}
/esbuild-freebsd-arm64/0.14.48:
resolution: {integrity: sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [freebsd]
@ -225,8 +240,8 @@ packages:
dev: true
optional: true
/esbuild-linux-32/0.14.42:
resolution: {integrity: sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg==}
/esbuild-linux-32/0.14.48:
resolution: {integrity: sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==}
engines: {node: '>=12'}
cpu: [ia32]
os: [linux]
@ -234,8 +249,8 @@ packages:
dev: true
optional: true
/esbuild-linux-64/0.14.42:
resolution: {integrity: sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA==}
/esbuild-linux-64/0.14.48:
resolution: {integrity: sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
@ -243,8 +258,8 @@ packages:
dev: true
optional: true
/esbuild-linux-arm/0.14.42:
resolution: {integrity: sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg==}
/esbuild-linux-arm/0.14.48:
resolution: {integrity: sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==}
engines: {node: '>=12'}
cpu: [arm]
os: [linux]
@ -252,8 +267,8 @@ packages:
dev: true
optional: true
/esbuild-linux-arm64/0.14.42:
resolution: {integrity: sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA==}
/esbuild-linux-arm64/0.14.48:
resolution: {integrity: sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
@ -261,8 +276,8 @@ packages:
dev: true
optional: true
/esbuild-linux-mips64le/0.14.42:
resolution: {integrity: sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg==}
/esbuild-linux-mips64le/0.14.48:
resolution: {integrity: sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==}
engines: {node: '>=12'}
cpu: [mips64el]
os: [linux]
@ -270,8 +285,8 @@ packages:
dev: true
optional: true
/esbuild-linux-ppc64le/0.14.42:
resolution: {integrity: sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg==}
/esbuild-linux-ppc64le/0.14.48:
resolution: {integrity: sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==}
engines: {node: '>=12'}
cpu: [ppc64]
os: [linux]
@ -279,8 +294,8 @@ packages:
dev: true
optional: true
/esbuild-linux-riscv64/0.14.42:
resolution: {integrity: sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ==}
/esbuild-linux-riscv64/0.14.48:
resolution: {integrity: sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==}
engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@ -288,8 +303,8 @@ packages:
dev: true
optional: true
/esbuild-linux-s390x/0.14.42:
resolution: {integrity: sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ==}
/esbuild-linux-s390x/0.14.48:
resolution: {integrity: sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==}
engines: {node: '>=12'}
cpu: [s390x]
os: [linux]
@ -297,8 +312,8 @@ packages:
dev: true
optional: true
/esbuild-netbsd-64/0.14.42:
resolution: {integrity: sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw==}
/esbuild-netbsd-64/0.14.48:
resolution: {integrity: sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==}
engines: {node: '>=12'}
cpu: [x64]
os: [netbsd]
@ -306,8 +321,8 @@ packages:
dev: true
optional: true
/esbuild-openbsd-64/0.14.42:
resolution: {integrity: sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA==}
/esbuild-openbsd-64/0.14.48:
resolution: {integrity: sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==}
engines: {node: '>=12'}
cpu: [x64]
os: [openbsd]
@ -315,8 +330,8 @@ packages:
dev: true
optional: true
/esbuild-sunos-64/0.14.42:
resolution: {integrity: sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ==}
/esbuild-sunos-64/0.14.48:
resolution: {integrity: sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==}
engines: {node: '>=12'}
cpu: [x64]
os: [sunos]
@ -324,8 +339,8 @@ packages:
dev: true
optional: true
/esbuild-windows-32/0.14.42:
resolution: {integrity: sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g==}
/esbuild-windows-32/0.14.48:
resolution: {integrity: sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==}
engines: {node: '>=12'}
cpu: [ia32]
os: [win32]
@ -333,8 +348,8 @@ packages:
dev: true
optional: true
/esbuild-windows-64/0.14.42:
resolution: {integrity: sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA==}
/esbuild-windows-64/0.14.48:
resolution: {integrity: sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
@ -342,8 +357,8 @@ packages:
dev: true
optional: true
/esbuild-windows-arm64/0.14.42:
resolution: {integrity: sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw==}
/esbuild-windows-arm64/0.14.48:
resolution: {integrity: sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
@ -351,32 +366,32 @@ packages:
dev: true
optional: true
/esbuild/0.14.42:
resolution: {integrity: sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw==}
/esbuild/0.14.48:
resolution: {integrity: sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==}
engines: {node: '>=12'}
hasBin: true
requiresBuild: true
optionalDependencies:
esbuild-android-64: 0.14.42
esbuild-android-arm64: 0.14.42
esbuild-darwin-64: 0.14.42
esbuild-darwin-arm64: 0.14.42
esbuild-freebsd-64: 0.14.42
esbuild-freebsd-arm64: 0.14.42
esbuild-linux-32: 0.14.42
esbuild-linux-64: 0.14.42
esbuild-linux-arm: 0.14.42
esbuild-linux-arm64: 0.14.42
esbuild-linux-mips64le: 0.14.42
esbuild-linux-ppc64le: 0.14.42
esbuild-linux-riscv64: 0.14.42
esbuild-linux-s390x: 0.14.42
esbuild-netbsd-64: 0.14.42
esbuild-openbsd-64: 0.14.42
esbuild-sunos-64: 0.14.42
esbuild-windows-32: 0.14.42
esbuild-windows-64: 0.14.42
esbuild-windows-arm64: 0.14.42
esbuild-android-64: 0.14.48
esbuild-android-arm64: 0.14.48
esbuild-darwin-64: 0.14.48
esbuild-darwin-arm64: 0.14.48
esbuild-freebsd-64: 0.14.48
esbuild-freebsd-arm64: 0.14.48
esbuild-linux-32: 0.14.48
esbuild-linux-64: 0.14.48
esbuild-linux-arm: 0.14.48
esbuild-linux-arm64: 0.14.48
esbuild-linux-mips64le: 0.14.48
esbuild-linux-ppc64le: 0.14.48
esbuild-linux-riscv64: 0.14.48
esbuild-linux-s390x: 0.14.48
esbuild-netbsd-64: 0.14.48
esbuild-openbsd-64: 0.14.48
esbuild-sunos-64: 0.14.48
esbuild-windows-32: 0.14.48
esbuild-windows-64: 0.14.48
esbuild-windows-arm64: 0.14.48
dev: true
/execa/5.1.1:
@ -517,13 +532,17 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/jose/4.8.3:
resolution: {integrity: sha512-7rySkpW78d8LBp4YU70Wb7+OTgE3OwAALNVZxhoIhp4Kscp+p/fBkdpxGAMKxvCAMV4QfXBU9m6l9nX/vGwd2g==}
dev: false
/joycon/3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
dev: true
/kleur/4.1.4:
resolution: {integrity: sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==}
/kleur/4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
dev: true
@ -601,12 +620,12 @@ packages:
dev: true
/object-assign/4.1.1:
resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
dev: true
/once/1.4.0:
resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=}
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies:
wrappy: 1.0.2
dev: true
@ -619,7 +638,7 @@ packages:
dev: true
/path-is-absolute/1.0.1:
resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=}
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
dev: true
@ -678,8 +697,8 @@ packages:
engines: {node: '>=8'}
dev: true
/retes/0.27.1:
resolution: {integrity: sha512-qK+cQf39EIyMIR3nrLtEnRpGHneuL4gI0GFfQsFF56L71RZz9R+YfD6Aqiw1EKDukKSRrugvHLu8/ffCZg+q4g==}
/retes/0.29.4:
resolution: {integrity: sha512-c6Ji2oGfXN/abuLRVLUT0/eklLuAlargjBR0Ru/FAhgmL2TtEhNl2OQ3UnFSUYXa8a6v9qrEb6UvIp0A6KlJ5w==}
dependencies:
busboy: 1.6.0
dev: false
@ -688,8 +707,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
/rollup/2.75.3:
resolution: {integrity: sha512-YA29fLU6MAYSaDxIQYrGGOcbXlDmG96h0krGGYObroezcQ0KgEPM3+7MtKD/qeuUbFuAJXvKZee5dA1dpwq1PQ==}
/rollup/2.75.7:
resolution: {integrity: sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==}
engines: {node: '>=10.0.0'}
hasBin: true
optionalDependencies:
@ -746,8 +765,8 @@ packages:
engines: {node: '>=6'}
dev: true
/sucrase/3.21.0:
resolution: {integrity: sha512-FjAhMJjDcifARI7bZej0Bi1yekjWQHoEvWIXhLPwDhC6O4iZ5PtGb86WV56riW87hzpgB13wwBKO9vKAiWu5VQ==}
/sucrase/3.23.0:
resolution: {integrity: sha512-xgC1xboStzGhCnRywlBf/DLmkC+SkdAKqrNCDsxGrzM0phR5oUxoFKiQNrsc2D8wDdAm03iLbSZqjHDddo3IzQ==}
engines: {node: '>=8'}
hasBin: true
dependencies:
@ -760,7 +779,7 @@ packages:
dev: true
/thenify-all/1.6.0:
resolution: {integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=}
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
dependencies:
thenify: 3.3.1
@ -779,7 +798,7 @@ packages:
is-number: 7.0.0
/tr46/1.0.1:
resolution: {integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=}
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
dependencies:
punycode: 2.1.1
dev: true
@ -798,11 +817,11 @@ packages:
engines: {node: '>=12'}
hasBin: true
dependencies:
esbuild: 0.14.42
esbuild: 0.14.48
dev: true
/tsup/6.0.1_typescript@4.7.2:
resolution: {integrity: sha512-2Pl1YkEEvzfg4aYgwUILaHV0wwZQKO7mNHMQChyzdCNlQqf11eug7gWk86XCb3CvRofCXBX87x73BTGjyS3cOQ==}
/tsup/6.1.3_typescript@4.7.4:
resolution: {integrity: sha512-eRpBnbfpDFng+EJNTQ90N7QAf4HAGGC7O3buHIjroKWK7D1ibk9/YnR/3cS8HsMU5T+6Oi+cnF+yU5WmCnB//Q==}
engines: {node: '>=14'}
hasBin: true
peerDependencies:
@ -817,40 +836,40 @@ packages:
typescript:
optional: true
dependencies:
bundle-require: 3.0.4_esbuild@0.14.42
bundle-require: 3.0.4_esbuild@0.14.48
cac: 6.7.12
chokidar: 3.5.3
debug: 4.3.4
esbuild: 0.14.42
esbuild: 0.14.48
execa: 5.1.1
globby: 11.1.0
joycon: 3.1.1
postcss-load-config: 3.1.4
resolve-from: 5.0.0
rollup: 2.75.3
rollup: 2.75.7
source-map: 0.8.0-beta.0
sucrase: 3.21.0
sucrase: 3.23.0
tree-kill: 1.2.2
typescript: 4.7.2
typescript: 4.7.4
transitivePeerDependencies:
- supports-color
- ts-node
dev: true
/typescript/4.7.2:
resolution: {integrity: sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==}
/typescript/4.7.4:
resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
engines: {node: '>=4.2.0'}
hasBin: true
dev: true
/uvu/0.5.3:
resolution: {integrity: sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==}
/uvu/0.5.6:
resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
engines: {node: '>=8'}
hasBin: true
dependencies:
dequal: 2.0.2
diff: 5.1.0
kleur: 4.1.4
kleur: 4.1.5
sade: 1.8.1
dev: true
@ -883,7 +902,7 @@ packages:
dev: true
/wrappy/1.0.2:
resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=}
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: true
/yaml/1.10.2:

View file

@ -1,8 +1,11 @@
import crypto from "crypto";
import * as jose from "jose";
import type { Middleware } from "retes";
import { Response } from "retes/response";
import { Response } from 'retes/response';
import * as Const from './const';
import { SALEOR_DOMAIN_HEADER, SALEOR_EVENT_HEADER } from "./const";
import { jwksUrl } from "./urls";
export const withBaseURL: Middleware = (handler) => async (request) => {
const { host, "x-forwarded-proto": protocol = "http" } = request.headers;
@ -11,33 +14,101 @@ export const withBaseURL: Middleware = (handler) => async (request) => {
const response = await handler(request);
return response;
}
};
export const withSaleorDomainPresent: Middleware = (handler) => async (request) => {
const saleor_domain = request.headers[Const.SALEOR_DOMAIN_HEADER];
export const withSaleorDomainPresent: Middleware =
(handler) => async (request) => {
const saleor_domain = request.headers[SALEOR_DOMAIN_HEADER];
if (!saleor_domain) {
return Response.BadRequest({ success: false, message: "Missing Saleor domain header." });
return Response.BadRequest({
success: false,
message: "Missing Saleor domain header.",
});
}
return handler(request);
};
};
export const withSaleorEventMatch = (expectedEvent: string): Middleware => (handler) => async (request) => {
const receivedEvent = request.headers[Const.SALEOR_EVENT_HEADER];
export const withSaleorEventMatch =
(expectedEvent: string): Middleware =>
(handler) =>
async (request) => {
const receivedEvent = request.headers[SALEOR_EVENT_HEADER];
if (receivedEvent !== expectedEvent) {
return Response.BadRequest({ success: false, message: "Invalid Saleor Event" });
return Response.BadRequest({
success: false,
message: "Invalid Saleor Event",
});
}
return handler(request);
};
};
export const withAuthTokenRequired: Middleware = (handler) => async (request) => {
export const withAuthTokenRequired: Middleware =
(handler) => async (request) => {
const auth_token = request.params.auth_token;
if (!auth_token) {
return Response.BadRequest({ success: false, message: "Missing auth token." });
return Response.BadRequest({
success: false,
message: "Missing auth token.",
});
}
return handler(request);
};
export const withWebhookSignatureVerified = (
secretKey: string | undefined = undefined
): Middleware => {
return (handler) => async (request) => {
if (request.rawBody === undefined) {
return Response.InternalServerError({
success: false,
message: "Request payload already parsed.",
});
}
const {
[SALEOR_DOMAIN_HEADER]: saleorDomain,
"saleor-signature": payloadSignature,
} = request.headers;
if (secretKey !== undefined) {
const calculatedSignature = crypto
.createHmac("sha256", secretKey)
.update(request.rawBody)
.digest("hex");
if (calculatedSignature !== payloadSignature) {
return Response.BadRequest({
success: false,
message: "Invalid signature.",
});
}
} else {
const [header, _, signature] = payloadSignature.split(".");
const jws = {
protected: header,
payload: request.rawBody,
signature,
};
const jwksKey = await jose.createRemoteJWKSet(
new URL(jwksUrl(saleorDomain))
)(header, payloadSignature);
try {
await jose.flattenedVerify(jws, jwksKey);
} catch {
return Response.BadRequest({
success: false,
message: "Invalid signature.",
});
}
}
return handler(request);
};
};

8
src/urls.ts Normal file
View file

@ -0,0 +1,8 @@
const urlProtocol = (saleorDomain: string): string =>
saleorDomain === "localhost:8000" ? "http" : "https";
export const jwksUrl = (saleorDomain: string): string =>
`${urlProtocol(saleorDomain)}://${saleorDomain}/.well-known/jwks.json`;
export const graphQLUrl = (saleorDomain: string): string =>
`${urlProtocol(saleorDomain)}://${saleorDomain}/graphql/`;