diff --git a/package-lock.json b/package-lock.json index fca8b35e3..e7202ee3b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -483,9 +483,9 @@ } }, "@comunica/actor-rdf-parse-html-microdata": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-microdata/-/actor-rdf-parse-html-microdata-1.18.0.tgz", - "integrity": "sha512-2IjfPDXqS6IW+9k6RM2mcd8dx9gW4NeBL1teNfSpAIH3mBdRdum+FAfbeWirOOIX+lpKJ3pKo57mXf5eUFNkXw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-microdata/-/actor-rdf-parse-html-microdata-1.18.1.tgz", + "integrity": "sha512-ErW0ngwOnEXbGr2fskQYBvau1ZsvB3IbQimAcNAx9m+pIeoDF51+qjpTTZpcckgbTN9wUsNfGCwxk9jbKH2nTQ==", "requires": { "microdata-rdf-streaming-parser": "^1.1.0" } @@ -6082,9 +6082,9 @@ "dev": true }, "jose": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-3.1.3.tgz", - "integrity": "sha512-ppasqfGfKZ8hmpJVAuXfQR8S+AiDCcUa2Cj1WDw+I4Ui7J9iIfsg1CIjMSlwxN1PtK6yiSKqIXfi9mTDrXQm/w==" + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jose/-/jose-3.5.0.tgz", + "integrity": "sha512-pW9z+ny33gxX2wXLQl3SkPQWGaUvOMYLijuiMHIHUYIDsrZjdMqYYS5UTkusuMzZkqe5T8YImA4FOqqB1IWmRg==" }, "js-tokens": { "version": "4.0.0", @@ -6484,7 +6484,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6810,6 +6809,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nmspc": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/nmspc/-/nmspc-0.2.4.tgz", + "integrity": "sha512-8/QG1B93zCXqkCQfOnQ1Ihh54+jWgVddqS3i3/OPUyVc4ChNtcU5H7I65jQ9z1WqM3ywV/bacmy+c14IvzccGg==" + }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -9335,29 +9339,31 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-dpop": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ts-dpop/-/ts-dpop-0.1.1.tgz", - "integrity": "sha512-KrIafLRqG9XLiRghAe7TKy9H0fQ1VNxdG+rOc5k/DoN9dJCQKFWKSyggwPoi5y5sQX2OZKaJCgbQO5c3aH1e5g==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/ts-dpop/-/ts-dpop-0.2.7.tgz", + "integrity": "sha512-vu7xLgEVHzmUYonI6hfHeGXeGZiLSlDInI26AZ0UrFNBVqGR6OG+gIOF8t/Wtr+xPgFb0jJmMRMM5XPEij2Q7A==", "requires": { "cross-fetch": "^3.0.6", - "jose": "^3.1.0", + "jose": "^3.3.2", + "lru-cache": "^6.0.0", "n3": "^1.6.4", + "nmspc": "^0.2.2", + "rdf-data-factory": "^1.0.4", "rdf-dereference": "^1.6.0", "rdf-parse": "^1.6.1", "rdf-store-stream": "^1.1.0", - "ts-guards": "^0.5.1", - "uuid": "^8.3.1" + "ts-guards": "^0.5.1" }, "dependencies": { "@comunica/actor-abstract-mediatyped": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-abstract-mediatyped/-/actor-abstract-mediatyped-1.18.0.tgz", - "integrity": "sha512-bu6QorV2OPdHHWuw6lbI87mTTAZKS6TbQA6fNBFBw7LfwMfLugMrjUTxJcJ/UKXV4uPkpJRhhKEG6hns+k0S/g==" + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-abstract-mediatyped/-/actor-abstract-mediatyped-1.18.1.tgz", + "integrity": "sha512-pjAf0agOpADEVBKp11XhFGH33FML4LTxO08JJmr6Qf6FlbMAhU3KFBrK34nYZ/5QNdhZwE2i8eFmjNC/2CbOKA==" }, "@comunica/actor-http-native": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-http-native/-/actor-http-native-1.18.0.tgz", - "integrity": "sha512-wooUx1R0VKfDxtiui5dS5JSstQmRxl1fQY9q6iwYlEMcMXST6RsIhcRi5MWqEaJE5cVsTEBMXO4Fqdl51kvgeg==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-http-native/-/actor-http-native-1.18.1.tgz", + "integrity": "sha512-nQ7dlB3GkP46h28XVyOi43Q4fuc1pUaYWFz6YQeTOgyJMnm/fgNvu9ECsFdG4rYVo3377VVxpvCylGx936S+wQ==", "requires": { "@types/parse-link-header": "^1.0.0", "cross-fetch": "^3.0.5", @@ -9366,37 +9372,37 @@ } }, "@comunica/actor-rdf-parse-html": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html/-/actor-rdf-parse-html-1.18.0.tgz", - "integrity": "sha512-0mdU7msQJwdSVtSSAOGE3xykaW22Zg/bytjBe0sG+/S82wGnZdTYEmchzR4prH/R+IyRhZHVgNzGzmcaasX66A==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html/-/actor-rdf-parse-html-1.18.1.tgz", + "integrity": "sha512-Wx5c/4bN7ohJjsp397JeX8YTDZXMp3VWEFilIjl4/CtAoGV4BzYlHPFo3ZCuRjRpn2EPyJF0Itxedio0b30u3A==", "requires": { - "@comunica/bus-rdf-parse-html": "^1.18.0", + "@comunica/bus-rdf-parse-html": "^1.18.1", "@types/rdf-js": "*", "htmlparser2": "^5.0.0" } }, "@comunica/actor-rdf-parse-html-rdfa": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-rdfa/-/actor-rdf-parse-html-rdfa-1.18.0.tgz", - "integrity": "sha512-tvfQP01uxcgZIDF6aXO83ckzNf/lrkLavLI2QQciuLXToCDFgTwXqyEPeZs4/nf1L3uuXJOIzP0Bq0ZnVAgLBw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-rdfa/-/actor-rdf-parse-html-rdfa-1.18.1.tgz", + "integrity": "sha512-c1ae+6F+ohTIAscItsVI/+dKY5tKx7sJwKrrznwgXoPlkFxk7aI9W03Du8X1FsT+spNlk3+CIA/lUPrZ53Lhhw==", "requires": { "rdfa-streaming-parser": "^1.4.0" } }, "@comunica/actor-rdf-parse-html-script": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-script/-/actor-rdf-parse-html-script-1.18.0.tgz", - "integrity": "sha512-j/Pcj3oXPDXjnhshKdtk355HhZDNIUItzkDxH1EBdL9S0Ll6HbEt0DJwXy51JRFxiK/ZpfXWGCHuOC1rOtP1oQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-html-script/-/actor-rdf-parse-html-script-1.18.1.tgz", + "integrity": "sha512-KI3h3Qb+/IibzFJjLWYVFn43pM0oyRaDovm9VzyGass4wbxmMUVm69lgOLTEcsmOVmTPNcvNI4dYa03g/zjwjA==", "requires": { - "@comunica/bus-rdf-parse-html": "^1.18.0", + "@comunica/bus-rdf-parse-html": "^1.18.1", "@types/rdf-js": "*", "relative-to-absolute-iri": "^1.0.5" } }, "@comunica/actor-rdf-parse-jsonld": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-jsonld/-/actor-rdf-parse-jsonld-1.18.0.tgz", - "integrity": "sha512-SbILO+HnBi88+M3XQQ7ZV3OKy3eqH0VHn6QuKYTcucOzcYtz60CeRRC0IVhEIKIbEHOpupZ3ZWOQzGudKZ71Rw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-jsonld/-/actor-rdf-parse-jsonld-1.18.1.tgz", + "integrity": "sha512-3X3REVIqRTgjzWUsfVgJQsyZ75J/SSl7mHfFchNncxRdm14hq67RApO0gztdSLj4t4Kv1HtciEm/zs+nEuKmNw==", "requires": { "@types/rdf-js": "*", "jsonld-context-parser": "^2.1.1", @@ -9405,83 +9411,83 @@ } }, "@comunica/actor-rdf-parse-n3": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-n3/-/actor-rdf-parse-n3-1.18.0.tgz", - "integrity": "sha512-4aud6izDZCzgNuo0ggCCQf4TdW9vyN0BU29kEXvWfX0kX6xIeTENOVuCddRSXEl9ndaD6WrJtnpG2GDu/tlqUA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-n3/-/actor-rdf-parse-n3-1.18.1.tgz", + "integrity": "sha512-5GQ+PaabjXSgu3mR8tN2ZWyy+pSaq6rIyHDNKAbh3AkG70j6tQWxfa4OZIk2+ImDEjtPVofYsJZnY5VSZhZEwg==", "requires": { "@types/n3": "^1.4.4", "n3": "^1.6.3" } }, "@comunica/actor-rdf-parse-rdfxml": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-rdfxml/-/actor-rdf-parse-rdfxml-1.18.0.tgz", - "integrity": "sha512-2bqH5JmCISZbE+9kdE6H42TVYEGArIzosWJrtPrAzhWhAi2hN7c+wpo8arqRe8UB8MxO58JbnuxxGaNJcSYonw==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-rdfxml/-/actor-rdf-parse-rdfxml-1.18.1.tgz", + "integrity": "sha512-qCn8UovKW6xNCoYgR13MBPi8mOOSorRxPLpSOt7eVFEADFMkjzVJAbyExN+8EzHgrJj2DIwQixD2kYnGaEkz+Q==", "requires": { "rdfxml-streaming-parser": "^1.4.0" } }, "@comunica/actor-rdf-parse-xml-rdfa": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-xml-rdfa/-/actor-rdf-parse-xml-rdfa-1.18.0.tgz", - "integrity": "sha512-Sp9VRNL4dVv6IQTSwjAY+4o46WV/SZq4PRebU/enWF82w5Pbj1Q4s1iRNXb+BZFUO7s3mihBcQ62+sJ4Ds7Big==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/actor-rdf-parse-xml-rdfa/-/actor-rdf-parse-xml-rdfa-1.18.1.tgz", + "integrity": "sha512-99g5zw57ZbxSKiv0daZiEWhu70Efs0dqKQsf4hIHl+1mZJ7gjYdXrA1gSb2h/bnvezZKyiqjkc9VxzD+J7dv0A==", "requires": { "rdfa-streaming-parser": "^1.3.0" } }, "@comunica/bus-http": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-http/-/bus-http-1.18.0.tgz", - "integrity": "sha512-SAfI+1Rk6caHlpRBpxiLpxmBWOA+dho4IurU+++LsmwC25353W8hjOSSg0GPnuLBebFO7YVcB1rTOyJfp53kcg==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-http/-/bus-http-1.18.1.tgz", + "integrity": "sha512-ovEy1HEagq2cla3WSCLyrA6LGMsfNyc7sm9UBJUnaX4KnYlOoombibsCwqiJhGfvHHV019yFj1l7NDICF3ZD3Q==", "requires": { "is-stream": "^2.0.0", "web-streams-node": "^0.4.0" } }, "@comunica/bus-init": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-init/-/bus-init-1.18.0.tgz", - "integrity": "sha512-BjDX31UWf2iTCVhhe3NllfizYGoE4Vh0YaY4s3RLOKpMCN6UlplmIprUELRSju0E8CRR2KHddNC1j5wt3a4cTw==" + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-init/-/bus-init-1.18.1.tgz", + "integrity": "sha512-eXIfQM4cl3dKwSd5GVt2lxcTxiSqxZZ/u8rjQeS/vncdRDfIAY7WS1qBHARUXEgeLRu5LX5W4Bq13TGwn+dkNQ==" }, "@comunica/bus-rdf-parse": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-parse/-/bus-rdf-parse-1.18.0.tgz", - "integrity": "sha512-zXH7AwnkF10agvNEXY08h8HAevjmcILl/S3CovMTtQLMaU1bGSQCjcYJl6QOIqYehYMntsvjeSKTSZ+VhESgOg==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-parse/-/bus-rdf-parse-1.18.1.tgz", + "integrity": "sha512-GNNCd1cEp+mjVeUG8eHI3u1x8+ic6MatHRET/ujMeouC0kI1jX31R57PoX9QWzopOx73tueI2i9E+5xLQDa29A==", "requires": { - "@comunica/actor-abstract-mediatyped": "^1.18.0", + "@comunica/actor-abstract-mediatyped": "^1.18.1", "@types/rdf-js": "*" } }, "@comunica/bus-rdf-parse-html": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-parse-html/-/bus-rdf-parse-html-1.18.0.tgz", - "integrity": "sha512-QGjV3p7O2c1mJOURrXHe+9uifLMPLwfW/jAhBpVt4UVzIoZl5onK9e8ukJBjxsCl1pnH07KOPO1i91VyBOWjWA==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/bus-rdf-parse-html/-/bus-rdf-parse-html-1.18.1.tgz", + "integrity": "sha512-bV4N7ABCshWi0S4VliibGLtazYGiToVyeMqhFBMyl/v8IaPOW+2QbE4JfXcen8+ieHqonFt28W/x9gbh7VEZeA==", "requires": { "@types/rdf-js": "*" } }, "@comunica/core": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/core/-/core-1.18.0.tgz", - "integrity": "sha512-7JCzSJkilbemhIiSSpFuylbEqMntWp+JSs3gNgvb+r7NzxDXlB9l1Ng3UVJg6QvoO8EuoprwRGyeiG2824TarQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/core/-/core-1.18.1.tgz", + "integrity": "sha512-wXLOu/Wkt0zUy6XwI4W7IaXkcLmEkxs0P/xWY3huMdG5ixvFxVlOz+EuKz5sNCpeGiqZsMON4I9YvgiUlnZv0Q==", "requires": { "immutable": "^3.8.2" } }, "@comunica/mediator-combine-union": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/mediator-combine-union/-/mediator-combine-union-1.18.0.tgz", - "integrity": "sha512-AO6DxwSQubD4p6dWllom3jXLP7zEYWVsI3pmXsnJYP8TqUtcJ0Mah5JaCnzbHIcRToZIy/WUDUN9Kcxp0ZwCXA==" + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/mediator-combine-union/-/mediator-combine-union-1.18.1.tgz", + "integrity": "sha512-w4S4WNwjh+8zjz154YaEL1p4VWYYD5yNhPTH/mIvk5IS2R6TLqTQ0qlk5JvOvDA5aL8IiOndG0rTPXxFS8dhxw==" }, "@comunica/mediator-number": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/mediator-number/-/mediator-number-1.18.0.tgz", - "integrity": "sha512-JGoUQRJQSLiAkBPAE2591DhMyv0mT24l91vyfo5TPKNtHXa0ull12fYRpPaXbRTGGAENKvxoEFR491vi1XIb8A==" + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/mediator-number/-/mediator-number-1.18.1.tgz", + "integrity": "sha512-nJNrMi01l9eLEttWlcIvabLoOEr31Dw19VoOClYvPC315e60DYuX4b5PTZNIuTTjv5x39DVRQ2qjFVMdFjn3sQ==" }, "@comunica/mediator-race": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@comunica/mediator-race/-/mediator-race-1.18.0.tgz", - "integrity": "sha512-8iEFxjQdi4wCSz+4yVywhF/DpcWWDxZ0GZZwc2Qp6ShyX79Zn/I2LEDuj50Uuh+0fHDt91H5Em9UhRMI7IRtLQ==" + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/@comunica/mediator-race/-/mediator-race-1.18.1.tgz", + "integrity": "sha512-UN9yT62mHTbIvCxyMyMx63wbYVB2Z7tq0pzHrVOUTlx09QMHkyIr8wVkaAiTzXfm/PKTX9awNNpmXrAz9Sw8kA==" }, "htmlparser2": { "version": "5.0.1", @@ -10116,8 +10122,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.0", diff --git a/package.json b/package.json index c3f91930a..a887b3c57 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "sparqlalgebrajs": "^2.3.1", "sparqljs": "^3.1.2", "streamify-array": "^1.0.1", - "ts-dpop": "^0.1.1", + "ts-dpop": "^0.2.7", "uuid": "^8.3.0", "winston": "^3.3.3", "winston-transport": "^4.4.0", diff --git a/src/authentication/DPoPWebIdExtractor.ts b/src/authentication/DPoPWebIdExtractor.ts index e495ee842..58af404ce 100644 --- a/src/authentication/DPoPWebIdExtractor.ts +++ b/src/authentication/DPoPWebIdExtractor.ts @@ -1,4 +1,5 @@ -import { verify } from 'ts-dpop'; +import type { RequestMethod, VerifySolidIdentityFunction } from 'ts-dpop'; +import { createSolidIdentityVerifier } from 'ts-dpop'; import type { TargetExtractor } from '../ldp/http/TargetExtractor'; import { getLoggerFor } from '../logging/LogUtil'; import type { HttpRequest } from '../server/HttpRequest'; @@ -13,31 +14,40 @@ import { CredentialsExtractor } from './CredentialsExtractor'; export class DPoPWebIdExtractor extends CredentialsExtractor { protected readonly logger = getLoggerFor(this); private readonly targetExtractor: TargetExtractor; + private readonly verify: VerifySolidIdentityFunction; public constructor(targetExtractor: TargetExtractor) { super(); this.targetExtractor = targetExtractor; + this.verify = createSolidIdentityVerifier(); } public async canHandle({ headers }: HttpRequest): Promise { const { authorization } = headers; if (!authorization || !authorization.startsWith('DPoP ')) { - throw new NotImplementedHttpError('No DPoP Authorization header specified.'); + throw new NotImplementedHttpError('No DPoP-bound Authorization header specified.'); } } public async handle(request: HttpRequest): Promise { const { headers: { authorization, dpop }, method } = request; if (!dpop) { - throw new BadRequestHttpError('No DPoP token specified.'); + throw new BadRequestHttpError('No DPoP header specified.'); } const resource = await this.targetExtractor.handleSafe(request); + try { - const webId = await verify(authorization as string, dpop as string, method as any, resource.path); - this.logger.info(`Verified WebID via DPoP token: ${webId}`); + const { webid: webId } = await this.verify( + authorization as string, + dpop as string, + method as RequestMethod, + resource.path, + ); + + this.logger.info(`Verified WebID via DPoP-bound access token: ${webId}`); return { webId }; } catch (error: unknown) { - const message = `Error verifying WebID via DPoP token: ${(error as Error).message}`; + const message = `Error verifying WebID via DPoP-bound access token: ${(error as Error).message}`; this.logger.warn(message); throw new BadRequestHttpError(message); } diff --git a/test/__mocks__/ts-dpop.ts b/test/__mocks__/ts-dpop.ts index 01b9255e1..2dba8a99c 100644 --- a/test/__mocks__/ts-dpop.ts +++ b/test/__mocks__/ts-dpop.ts @@ -1 +1,4 @@ -export const verify = jest.fn((): string => 'http://alice.example/card#me'); +import type { VerifySolidIdentityFunction } from 'ts-dpop'; + +const solidIdentityVerifier = jest.fn().mockResolvedValue({ aud: 'solid', exp: 1234, iat: 1234, iss: 'example.com/idp', webid: 'http://alice.example/card#me' }); +export const createSolidIdentityVerifier = jest.fn((): VerifySolidIdentityFunction => solidIdentityVerifier); diff --git a/test/unit/authentication/DPoPWebIdExtractor.test.ts b/test/unit/authentication/DPoPWebIdExtractor.test.ts index 5dc21bb5a..0117c1c5c 100644 --- a/test/unit/authentication/DPoPWebIdExtractor.test.ts +++ b/test/unit/authentication/DPoPWebIdExtractor.test.ts @@ -1,10 +1,12 @@ -import { verify } from 'ts-dpop'; +import { createSolidIdentityVerifier } from 'ts-dpop'; import { DPoPWebIdExtractor } from '../../../src/authentication/DPoPWebIdExtractor'; import type { HttpRequest } from '../../../src/server/HttpRequest'; import { BadRequestHttpError } from '../../../src/util/errors/BadRequestHttpError'; import { NotImplementedHttpError } from '../../../src/util/errors/NotImplementedHttpError'; import { StaticAsyncHandler } from '../../util/StaticAsyncHandler'; +const solidIdentityVerifier = createSolidIdentityVerifier() as jest.MockedFunction; + describe('A DPoPWebIdExtractor', (): void => { const targetExtractor = new StaticAsyncHandler(true, { path: 'http://example.org/foo/bar' }); const webIdExtractor = new DPoPWebIdExtractor(targetExtractor); @@ -25,7 +27,7 @@ describe('A DPoPWebIdExtractor', (): void => { it('throws an error.', async(): Promise => { const result = webIdExtractor.handleSafe(request); await expect(result).rejects.toThrow(NotImplementedHttpError); - await expect(result).rejects.toThrow('No DPoP Authorization header specified.'); + await expect(result).rejects.toThrow('No DPoP-bound Authorization header specified.'); }); }); @@ -41,7 +43,7 @@ describe('A DPoPWebIdExtractor', (): void => { it('throws an error.', async(): Promise => { const result = webIdExtractor.handleSafe(request); await expect(result).rejects.toThrow(NotImplementedHttpError); - await expect(result).rejects.toThrow('No DPoP Authorization header specified.'); + await expect(result).rejects.toThrow('No DPoP-bound Authorization header specified.'); }); }); @@ -56,7 +58,7 @@ describe('A DPoPWebIdExtractor', (): void => { it('throws an error.', async(): Promise => { const result = webIdExtractor.handleSafe(request); await expect(result).rejects.toThrow(BadRequestHttpError); - await expect(result).rejects.toThrow('No DPoP token specified.'); + await expect(result).rejects.toThrow('No DPoP header specified.'); }); }); @@ -77,8 +79,8 @@ describe('A DPoPWebIdExtractor', (): void => { it('calls the DPoP verifier with the correct parameters.', async(): Promise => { await webIdExtractor.handleSafe(request); - expect(verify).toHaveBeenCalledTimes(1); - expect(verify).toHaveBeenCalledWith('DPoP token-1234', 'token-5678', 'GET', 'http://example.org/foo/bar'); + expect(solidIdentityVerifier).toHaveBeenCalledTimes(1); + expect(solidIdentityVerifier).toHaveBeenCalledWith('DPoP token-1234', 'token-5678', 'GET', 'http://example.org/foo/bar'); }); it('returns the extracted WebID.', async(): Promise => { @@ -97,7 +99,7 @@ describe('A DPoPWebIdExtractor', (): void => { } as any as HttpRequest; beforeEach((): void => { - (verify as jest.MockedFunction).mockImplementationOnce((): void => { + solidIdentityVerifier.mockImplementationOnce((): void => { throw new Error('invalid'); }); }); @@ -105,7 +107,7 @@ describe('A DPoPWebIdExtractor', (): void => { it('throws an error.', async(): Promise => { const result = webIdExtractor.handleSafe(request); await expect(result).rejects.toThrow(BadRequestHttpError); - await expect(result).rejects.toThrow('Error verifying WebID via DPoP token: invalid'); + await expect(result).rejects.toThrow('Error verifying WebID via DPoP-bound access token: invalid'); }); }); });