diff --git a/package-lock.json b/package-lock.json index 7319ef7..2c72e8d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Open BSV License", "dependencies": { "@aws-sdk/client-s3": "^3.1130.0", - "@bsv/auth-express-middleware": "2.2.5", + "@bsv/auth-express-middleware": "2.2.6", "@bsv/identity-react": "^1.1.14", "@bsv/payment-express-middleware": "2.1.7", "@bsv/sdk": "2.8.4", @@ -663,9 +663,9 @@ } }, "node_modules/@bsv/auth-express-middleware": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-2.2.5.tgz", - "integrity": "sha512-gx2uL3N9pwBIcPJhe9OSFKWvCelBP578gcPZFiav3ec3jgAkCM2hstB/gXeEMVGUFFAaGKHDdPwjvsRASNgxvQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-2.2.6.tgz", + "integrity": "sha512-yujQW5/b45b+CADf9MPxcYofHA6Y7yMV5TCXKYzkVH00ZipG5DhfRAwFOKVVmeH5cXh0zaMYsvlOtZrrTxdT9g==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "mime-types": "^3.0.2" diff --git a/package.json b/package.json index 9ae741f..8995869 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.1130.0", - "@bsv/auth-express-middleware": "2.2.5", + "@bsv/auth-express-middleware": "2.2.6", "@bsv/identity-react": "^1.1.14", "@bsv/payment-express-middleware": "2.1.7", "@bsv/sdk": "2.8.4", diff --git a/src/server/authCompatibility.test.ts b/src/server/authCompatibility.test.ts new file mode 100644 index 0000000..67bd5c4 --- /dev/null +++ b/src/server/authCompatibility.test.ts @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict' +import { once } from 'node:events' +import bodyParser from 'body-parser' +import express from 'express' +import { AuthFetch, PrivateKey, ProtoWallet, type WalletInterface } from '@bsv/sdk' +import { createAuthMiddleware } from '@bsv/auth-express-middleware' +import { it } from 'vitest' + +it('authenticates bodyless reader requests after the Express 4 JSON parser', async () => { + // This auth-only fixture needs signing/encryption methods and cannot spend. + const serverWallet = new ProtoWallet(PrivateKey.fromRandom()) as unknown as WalletInterface + const clientWallet = new ProtoWallet(PrivateKey.fromRandom()) as unknown as WalletInterface + const app = express() + app.use(bodyParser.json()) + app.use(createAuthMiddleware({ wallet: serverWallet, allowUnauthenticated: true })) + app.get('/api/private-reader', (req, res) => { + const request = req as typeof req & { auth?: { identityKey: string } } + res.json({ identityKey: request.auth?.identityKey }) + }) + const server = app.listen(0, '127.0.0.1') + await once(server, 'listening') + try { + const address = server.address() + assert.ok(address !== null && typeof address === 'object') + const client = new AuthFetch(clientWallet) + const response = await client.fetch(`http://127.0.0.1:${address.port}/api/private-reader?format=json`) + assert.equal(response.status, 200) + const { publicKey } = await clientWallet.getPublicKey({ identityKey: true }) + assert.deepEqual(await response.json(), { identityKey: publicKey }) + } finally { + server.closeAllConnections() + await new Promise((resolve, reject) => { server.close(error => error == null ? resolve() : reject(error)) }) + } +}, 10000)