solid-server 5.8.8-8b04c020 → 5.8.8-a4d2fc6d

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.
Files changed (37) hide show
  1. package/common/js/index-buttons.mjs +8 -3
  2. package/coverage/tmp/coverage-2270-1767346136095-0.json +1 -0
  3. package/coverage/tmp/{coverage-2329-1766874045743-0.json → coverage-2271-1767346114541-0.json} +1 -1
  4. package/eslint.config.mjs +1 -1
  5. package/lib/acl-checker.mjs +2 -1
  6. package/lib/create-server.mjs +2 -2
  7. package/lib/handlers/cors-proxy.mjs +2 -2
  8. package/lib/handlers/get.mjs +9 -13
  9. package/lib/ldp.mjs +3 -2
  10. package/lib/models/account-manager.mjs +1 -1
  11. package/lib/utils.mjs +1 -1
  12. package/lib/webid/lib/get.mjs +1 -0
  13. package/package.json +33 -19
  14. package/solid-server-5.8.8.tgz +0 -0
  15. package/test/index.mjs +3 -2
  16. package/test/integration/acl-oidc-test.mjs +2 -1
  17. package/test/integration/authentication-oidc-test.mjs +6 -10
  18. package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +9 -14
  19. package/test/integration/http-copy-test.mjs +2 -2
  20. package/test/integration/oidc-manager-test.mjs +95 -1
  21. package/test/resources/accounts/db/oidc/op/clients/{_key_5679b38cc39322649b358828e549f081.json → _key_e989e9f58cf29869c56a68ceb4256b69.json} +1 -1
  22. package/test/resources/accounts/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A3457.json +1 -1
  23. package/test/resources/accounts-scenario/alice/db/oidc/op/clients/{_key_cbb43052dfa98178e38cdbc019e04265.json → _key_a31de046443144df66179553447ffed2.json} +1 -1
  24. package/test/resources/accounts-scenario/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7000.json +1 -1
  25. package/test/resources/accounts-scenario/bob/db/oidc/op/clients/{_key_36a0d4102cba4fe51c5fe4a16081e9e9.json → _key_cf92a9f132c1973db4163b653050ac5f.json} +1 -1
  26. package/test/resources/accounts-scenario/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7001.json +1 -1
  27. package/test/resources/accounts-scenario/charlie/db/oidc/op/clients/{_key_4c0c9486e322b53857ab916a14ca0c7c.json → _key_25fe3c0bf640a75aecd0ccb1c2951eb1.json} +1 -1
  28. package/test/resources/accounts-scenario/charlie/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A5002.json +1 -1
  29. package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/clients/{_key_714755e5bd0de8bb6887def74e169a31.json → _key_1a5ed3aa47de01ee7438f2537e1b5331.json} +1 -1
  30. package/test/resources/accounts-strict-origin-off/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7010.json +1 -1
  31. package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/clients/{_key_4b633db2888c8406109667552ff9e46e.json → _key_30b67c31ec6753bde889bbb157e879c5.json} +1 -1
  32. package/test/resources/accounts-strict-origin-off/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7011.json +1 -1
  33. package/test/unit/create-account-request-test.mjs +1 -1
  34. package/test/unit/utils-test.mjs +3 -1
  35. package/test/utils/index.mjs +3 -2
  36. package/test/utils.mjs +3 -2
  37. package/coverage/tmp/coverage-2328-1766874068095-0.json +0 -1
package/eslint.config.mjs CHANGED
@@ -99,4 +99,4 @@ export default [
99
99
  'resources/**'
100
100
  ]
101
101
  }
102
- ]
102
+ ]
@@ -9,6 +9,7 @@ import aclCheck from '@solid/acl-check'
9
9
  import Url, { URL } from 'url'
10
10
  import { promisify } from 'util'
11
11
  import fs from 'fs'
12
+ import httpFetch from 'node-fetch'
12
13
 
13
14
  export const DEFAULT_ACL_SUFFIX = '.acl'
14
15
  const ACL = rdf.Namespace('http://www.w3.org/ns/auth/acl#')
@@ -307,7 +308,7 @@ function fetchLocalOrRemote (mapper, serverUri) {
307
308
  body = await promisify(fs.readFile)(path, { encoding: 'utf8' })
308
309
  } else {
309
310
  // Fetch the acl from the internet
310
- const response = await fetch(url)
311
+ const response = await httpFetch(url)
311
312
  body = await response.text()
312
313
  contentType = response.headers.get('content-type')
313
314
  }
@@ -65,8 +65,8 @@ function createServer (argv, app) {
65
65
  }
66
66
 
67
67
  const credentials = Object.assign({
68
- key,
69
- cert
68
+ key: key,
69
+ cert: cert
70
70
  }, argv)
71
71
 
72
72
  if (ldp.webid && ldp.auth === 'tls') {
@@ -3,7 +3,7 @@ import cors from 'cors'
3
3
  import debug from '../debug.mjs'
4
4
  import url from 'url'
5
5
  import dns from 'dns'
6
- import { isIP } from 'is-ip'
6
+ import isIp from 'is-ip'
7
7
  import ipRange from 'ip-range-check'
8
8
  import validUrl from 'valid-url'
9
9
 
@@ -73,7 +73,7 @@ function extractProxyConfig (req, res, next) {
73
73
 
74
74
  // Parse the URL and retrieve its host's IP address
75
75
  const { protocol, host, hostname, path } = url.parse(uri)
76
- if (isIP(hostname)) {
76
+ if (isIp(hostname)) {
77
77
  addProxyConfig(null, hostname)
78
78
  } else {
79
79
  dns.lookup(hostname, addProxyConfig)
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { createRequire } from 'module'
4
4
  import fs from 'fs'
5
- import { glob, hasMagic } from 'glob'
5
+ import glob from 'glob'
6
6
  import _path from 'path'
7
7
  import $rdf from 'rdflib'
8
8
  import Negotiator from 'negotiator'
@@ -37,7 +37,7 @@ export default async function handler (req, res, next) {
37
37
 
38
38
  res.header('Accept-Patch', 'text/n3, application/sparql-update, application/sparql-update-single-match')
39
39
  res.header('Accept-Post', '*/*')
40
- if (!path.endsWith('/') && !hasMagic(path)) res.header('Accept-Put', '*/*')
40
+ if (!path.endsWith('/') && !glob.hasMagic(path)) res.header('Accept-Put', '*/*')
41
41
 
42
42
  // Set live updates
43
43
  if (ldp.live) {
@@ -48,9 +48,9 @@ export default async function handler (req, res, next) {
48
48
 
49
49
  const options = {
50
50
  hostname: req.hostname,
51
- path,
52
- includeBody,
53
- possibleRDFType,
51
+ path: path,
52
+ includeBody: includeBody,
53
+ possibleRDFType: possibleRDFType,
54
54
  range: req.headers.range,
55
55
  contentType: req.headers.accept
56
56
  }
@@ -62,7 +62,7 @@ export default async function handler (req, res, next) {
62
62
  // set Accept-Put if container do not exist
63
63
  if (err.status === 404 && path.endsWith('/')) res.header('Accept-Put', 'text/turtle')
64
64
  // use globHandler if magic is detected
65
- if (err.status === 404 && hasMagic(path)) {
65
+ if (err.status === 404 && glob.hasMagic(path)) {
66
66
  debug('forwarding to glob request')
67
67
  return globHandler(req, res, next)
68
68
  } else {
@@ -188,9 +188,8 @@ async function globHandler (req, res, next) {
188
188
  nodir: true
189
189
  }
190
190
 
191
- try {
192
- const matches = await glob(`${folderPath}*`, globOptions)
193
- if (matches.length === 0) {
191
+ glob(`${folderPath}*`, globOptions, async (err, matches) => {
192
+ if (err || matches.length === 0) {
194
193
  debugGlob('No files matching the pattern')
195
194
  return next(HTTPError(404, 'No files matching glob pattern'))
196
195
  }
@@ -231,10 +230,7 @@ async function globHandler (req, res, next) {
231
230
 
232
231
  res.send(data)
233
232
  next()
234
- } catch (err) {
235
- debugGlob('Error during glob: ' + err)
236
- return next(HTTPError(500, 'Error processing glob pattern'))
237
- }
233
+ })
238
234
  }
239
235
 
240
236
  // TODO: get rid of this ugly hack that uses the Allow handler to check read permissions
package/lib/ldp.mjs CHANGED
@@ -9,9 +9,10 @@ import debug from './debug.mjs'
9
9
  import error from './http-error.mjs'
10
10
  import { stringToStream, serialize, overQuota, getContentType, parse } from './utils.mjs'
11
11
  import extend from 'extend'
12
- import { rimraf } from 'rimraf'
12
+ import rimraf from 'rimraf'
13
13
  import { exec } from 'child_process'
14
14
  import * as ldpContainer from './ldp-container.mjs'
15
+ import fetch from 'node-fetch'
15
16
  import { promisify } from 'util'
16
17
  import withLock from './lock.mjs'
17
18
  import { clearAclCache } from './acl-checker.mjs'
@@ -543,7 +544,7 @@ class LDP {
543
544
 
544
545
  // Delete the directory recursively
545
546
  try {
546
- await rimraf(directory)
547
+ await promisify(rimraf)(directory)
547
548
  } catch (err) {
548
549
  throw error(err, 'Failed to delete the container')
549
550
  }
@@ -258,7 +258,7 @@ class AccountManager {
258
258
  const emailData = {
259
259
  to: userAccount.email,
260
260
  webId: userAccount.webId,
261
- deleteUrl
261
+ deleteUrl: deleteUrl
262
262
  }
263
263
  return this.emailService.sendWithTemplate('delete-account.mjs', emailData)
264
264
  })
package/lib/utils.mjs CHANGED
@@ -289,7 +289,7 @@ export async function overQuota (root, serverUri) {
289
289
  * so it needs to be rewritten.
290
290
  */
291
291
  function actualSize (root) {
292
- return getSize(root)
292
+ return util.promisify(getSize)(root)
293
293
  }
294
294
 
295
295
  function _asyncReadfile (filename) {
@@ -1,3 +1,4 @@
1
+ import fetch from 'node-fetch'
1
2
  import { URL } from 'url'
2
3
 
3
4
  export default function get (webid, callback) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "solid-server",
3
3
  "description": "Solid server on top of the file-system",
4
- "version": "5.8.8-8b04c020",
4
+ "version": "5.8.8-a4d2fc6d",
5
5
  "author": {
6
6
  "name": "Tim Berners-Lee",
7
7
  "email": "timbl@w3.org"
@@ -59,14 +59,15 @@
59
59
  "homepage": "https://github.com/solid/node-solid-server",
60
60
  "bugs": "https://github.com/solid/node-solid-server/issues",
61
61
  "dependencies": {
62
- "@fastify/busboy": "^3.2.0",
62
+ "@fastify/busboy": "^1.2.1",
63
63
  "@fastify/pre-commit": "^2.2.1",
64
64
  "@solid/acl-check": "^0.4.5",
65
- "@solid/oidc-auth-manager": "^0.25.0",
66
- "@solid/oidc-op": "^0.12.0",
65
+ "@solid/oidc-auth-manager": "^0.25.1",
66
+ "@solid/oidc-op": "^0.12.1",
67
67
  "@solid/oidc-rp": "^0.12.0",
68
+ "@solid/solid-multi-rp-client": "^0.7.0",
68
69
  "async-lock": "^1.4.1",
69
- "body-parser": "^2.2.1",
70
+ "body-parser": "^1.20.4",
70
71
  "bootstrap": "^3.4.1",
71
72
  "cached-path-relative": "^1.1.0",
72
73
  "camelize": "^1.0.1",
@@ -75,6 +76,7 @@
75
76
  "commander": "^8.3.0",
76
77
  "cors": "^2.8.5",
77
78
  "debug": "^4.4.3",
79
+ "eslint": "^9.39.2",
78
80
  "express": "^4.22.1",
79
81
  "express-accept-events": "^0.3.0",
80
82
  "express-handlebars": "^5.3.5",
@@ -83,20 +85,21 @@
83
85
  "express-session": "^1.18.2",
84
86
  "extend": "^3.0.2",
85
87
  "from2": "^2.3.0",
86
- "fs-extra": "^11.3.3",
87
- "get-folder-size": "^5.0.0",
88
- "glob": "^13.0.0",
88
+ "fs-extra": "^10.1.0",
89
+ "get-folder-size": "^2.0.1",
90
+ "glob": "^7.2.3",
89
91
  "global-tunnel-ng": "^2.7.1",
90
92
  "handlebars": "^4.7.8",
91
93
  "http-proxy-middleware": "^2.0.9",
92
94
  "inquirer": "^8.2.7",
93
95
  "into-stream": "^5.1.1",
94
96
  "ip-range-check": "0.2.0",
95
- "is-ip": "^5.0.1",
97
+ "is-ip": "^2.0.0",
96
98
  "li": "^1.3.0",
97
99
  "mashlib": "^1.11.1",
98
- "mime-types": "^3.0.2",
99
- "negotiator": "^1.0.0",
100
+ "mime-types": "^2.1.35",
101
+ "negotiator": "^0.6.4",
102
+ "node-fetch": "^2.7.0",
100
103
  "node-forge": "^1.3.3",
101
104
  "node-mailer": "^0.1.1",
102
105
  "nodemailer": "^7.0.12",
@@ -104,13 +107,13 @@
104
107
  "owasp-password-strength-test": "^1.3.0",
105
108
  "rdflib": "^2.3.2",
106
109
  "recursive-readdir": "^2.2.3",
107
- "rimraf": "^6.1.2",
110
+ "rimraf": "^3.0.2",
108
111
  "solid-auth-client": "^2.5.6",
109
112
  "solid-namespace": "^0.5.4",
110
113
  "solid-ws": "^0.4.3",
111
114
  "text-encoder-lite": "^2.0.0",
112
115
  "the-big-username-blacklist": "^1.5.2",
113
- "ulid": "^3.0.2",
116
+ "ulid": "^2.4.0",
114
117
  "urijs": "^1.19.11",
115
118
  "uuid": "^13.0.0",
116
119
  "valid-url": "^1.0.9",
@@ -126,10 +129,9 @@
126
129
  "chai-as-promised": "7.1.2",
127
130
  "cross-env": "7.0.3",
128
131
  "dirty-chai": "2.0.1",
129
- "eslint": "^9.39.2",
130
- "globals": "^16.5.0",
132
+ "globals": "^17.0.0",
131
133
  "localstorage-memory": "1.0.3",
132
- "mocha": "^11.7.5",
134
+ "mocha": "^10.8.2",
133
135
  "nock": "^13.5.6",
134
136
  "node-mocks-http": "^1.17.2",
135
137
  "prep-fetch": "^0.1.0",
@@ -137,9 +139,9 @@
137
139
  "sinon": "12.0.1",
138
140
  "sinon-chai": "3.7.0",
139
141
  "snyk": "^1.1301.2",
140
- "supertest": "^7.1.4",
142
+ "supertest": "^6.3.4",
141
143
  "turtle-validator": "1.1.1",
142
- "whatwg-url": "^15.1.0"
144
+ "whatwg-url": "11.0.0"
143
145
  },
144
146
  "pre-commit": [
145
147
  "lint"
@@ -155,7 +157,7 @@
155
157
  "build": "echo nothing to build",
156
158
  "solid": "node ./bin/solid",
157
159
  "lint": "eslint \"**/*.mjs\"",
158
- "lint:fix": "eslint --fix \"**/*.mjs\"",
160
+ "lint-fix": "eslint --fix \"**/*.mjs\"",
159
161
  "validate": "node ./test/validate-turtle.mjs",
160
162
  "c8": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 c8 --reporter=text-summary mocha --recursive test/unit/ test/integration/",
161
163
  "mocha": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 mocha --recursive test/unit/ test/integration/",
@@ -192,6 +194,18 @@
192
194
  "node_modules/**"
193
195
  ]
194
196
  },
197
+ "standard": {
198
+ "globals": [
199
+ "after",
200
+ "afterEach",
201
+ "before",
202
+ "beforeEach",
203
+ "describe",
204
+ "it",
205
+ "fetch",
206
+ "AbortController"
207
+ ]
208
+ },
195
209
  "bin": {
196
210
  "solid": "bin/solid"
197
211
  },
Binary file
package/test/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import fs from 'fs-extra'
2
- import { rimrafSync } from 'rimraf'
2
+ import rimraf from 'rimraf'
3
3
  import path from 'path'
4
4
  import { fileURLToPath } from 'url'
5
5
  import OIDCProvider from '@solid/oidc-op'
@@ -7,6 +7,7 @@ import dns from 'dns'
7
7
  import ldnode from '../../index.mjs'
8
8
  // import ldnode from '../index.mjs'
9
9
  import supertest from 'supertest'
10
+ import fetch from 'node-fetch'
10
11
  import https from 'https'
11
12
 
12
13
  const __filename = fileURLToPath(import.meta.url)
@@ -15,7 +16,7 @@ const __dirname = path.dirname(__filename)
15
16
  const TEST_HOSTS = ['nic.localhost', 'tim.localhost', 'nicola.localhost']
16
17
 
17
18
  export function rm (file) {
18
- return rimrafSync(path.normalize(path.join(__dirname, '../resources/' + file)))
19
+ return rimraf.sync(path.normalize(path.join(__dirname, '../resources/' + file)))
19
20
  }
20
21
 
21
22
  export function cleanDir (dirPath) {
@@ -1,5 +1,6 @@
1
1
  import { assert } from 'chai'
2
2
  import fs from 'fs-extra'
3
+ import fetch from 'node-fetch'
3
4
  import path from 'path'
4
5
  import { fileURLToPath } from 'url'
5
6
  import { loadProvider, rm, checkDnsSettings, cleanDir } from '../utils.mjs'
@@ -32,7 +33,7 @@ function fetchRequest (method, options, callback) {
32
33
  callback(null, {
33
34
  statusCode: res.status,
34
35
  headers: Object.fromEntries(res.headers.entries()),
35
- body,
36
+ body: body,
36
37
  statusMessage: res.statusText
37
38
  }, body)
38
39
  })
@@ -6,6 +6,7 @@ import { UserStore } from '@solid/oidc-auth-manager'
6
6
  import UserAccount from '../../lib/models/user-account.mjs'
7
7
  import SolidAuthOIDC from '@solid/solid-auth-oidc'
8
8
 
9
+ import fetch from 'node-fetch'
9
10
  import localStorage from 'localstorage-memory'
10
11
  import { URL, URLSearchParams } from 'whatwg-url'
11
12
  import { cleanDir, cp } from '../utils.mjs'
@@ -641,7 +642,7 @@ describe('Authentication API (OIDC)', () => {
641
642
  // Since user is not logged in, /authorize redirects to /login
642
643
  expect(res.status).to.equal(302)
643
644
 
644
- loginUri = new URL(res.headers.get('location'), aliceServerUri)
645
+ loginUri = new URL(res.headers.get('location'))
645
646
  expect(loginUri.toString().startsWith(aliceServerUri + '/login'))
646
647
  .to.be.true()
647
648
 
@@ -685,11 +686,8 @@ describe('Authentication API (OIDC)', () => {
685
686
  })
686
687
  .then(res => {
687
688
  expect(res.status).to.equal(302)
688
- const location = res.headers.get('location')
689
- postLoginUri = new URL(location, aliceServerUri).toString()
690
- // Native fetch: get first set-cookie header
691
- const setCookieHeaders = res.headers.getSetCookie ? res.headers.getSetCookie() : [res.headers.get('set-cookie')]
692
- cookie = setCookieHeaders[0]
689
+ postLoginUri = res.headers.get('location')
690
+ cookie = res.headers.get('set-cookie')
693
691
 
694
692
  // Successful login gets redirected back to /authorize and then
695
693
  // back to app
@@ -714,8 +712,7 @@ describe('Authentication API (OIDC)', () => {
714
712
  })
715
713
  .then(res => {
716
714
  expect(res.status).to.equal(302)
717
- const location = res.headers.get('location')
718
- postSharingUri = new URL(location, aliceServerUri).toString()
715
+ postSharingUri = res.headers.get('location')
719
716
  // cookie = res.headers.get('set-cookie')
720
717
 
721
718
  // Successful login gets redirected back to /authorize and then
@@ -727,8 +724,7 @@ describe('Authentication API (OIDC)', () => {
727
724
  .then(res => {
728
725
  // User gets redirected back to original app
729
726
  expect(res.status).to.equal(302)
730
- const location = res.headers.get('location')
731
- callbackUri = location.startsWith('http') ? location : new URL(location, aliceServerUri).toString()
727
+ callbackUri = res.headers.get('location')
732
728
  expect(callbackUri.startsWith('https://app.example.com#'))
733
729
  })
734
730
  })
@@ -6,6 +6,7 @@ import { UserStore } from '@solid/oidc-auth-manager'
6
6
  import UserAccount from '../../lib/models/user-account.mjs'
7
7
  import SolidAuthOIDC from '@solid/solid-auth-oidc'
8
8
 
9
+ import fetch from 'node-fetch'
9
10
  import localStorage from 'localstorage-memory'
10
11
  import { URL, URLSearchParams } from 'whatwg-url'
11
12
  import { cleanDir, cp } from '../utils.mjs'
@@ -462,7 +463,7 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => {
462
463
  // Since user is not logged in, /authorize redirects to /login
463
464
  expect(res.status).to.equal(302)
464
465
 
465
- loginUri = new URL(res.headers.get('location'), aliceServerUri)
466
+ loginUri = new URL(res.headers.get('location'))
466
467
  expect(loginUri.toString().startsWith(aliceServerUri + '/login'))
467
468
  .to.be.true()
468
469
 
@@ -506,11 +507,8 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => {
506
507
  })
507
508
  .then(res => {
508
509
  expect(res.status).to.equal(302)
509
- const location = res.headers.get('location')
510
- postLoginUri = new URL(location, aliceServerUri).toString()
511
- // Native fetch: get first set-cookie header
512
- const setCookieHeaders = res.headers.getSetCookie ? res.headers.getSetCookie() : [res.headers.get('set-cookie')]
513
- cookie = setCookieHeaders[0]
510
+ postLoginUri = res.headers.get('location')
511
+ cookie = res.headers.get('set-cookie')
514
512
 
515
513
  // Successful login gets redirected back to /authorize and then
516
514
  // back to app
@@ -535,23 +533,20 @@ describe('Authentication API (OIDC) - With strict origins turned off', () => {
535
533
  })
536
534
  .then(res => {
537
535
  expect(res.status).to.equal(302)
538
- const location = res.headers.get('location')
539
- const postSharingUri = new URL(location, aliceServerUri).toString()
540
- const setCookieHeaders = res.headers.getSetCookie ? res.headers.getSetCookie() : [res.headers.get('set-cookie')]
541
- const cookieFromSharing = setCookieHeaders[0] || cookie
536
+ const postLoginUri = res.headers.get('location')
537
+ const cookie = res.headers.get('set-cookie')
542
538
 
543
539
  // Successful login gets redirected back to /authorize and then
544
540
  // back to app
545
- expect(postSharingUri.startsWith(aliceServerUri + '/authorize'))
541
+ expect(postLoginUri.startsWith(aliceServerUri + '/authorize'))
546
542
  .to.be.true()
547
543
 
548
- return fetch(postSharingUri, { redirect: 'manual', headers: { cookie: cookieFromSharing } })
544
+ return fetch(postLoginUri, { redirect: 'manual', headers: { cookie } })
549
545
  })
550
546
  .then(res => {
551
547
  // User gets redirected back to original app
552
548
  expect(res.status).to.equal(302)
553
- const location = res.headers.get('location')
554
- callbackUri = location.startsWith('http') ? location : new URL(location, aliceServerUri).toString()
549
+ callbackUri = res.headers.get('location')
555
550
  expect(callbackUri.startsWith('https://app.example.com#'))
556
551
  })
557
552
  })
@@ -52,8 +52,8 @@ describe('HTTP COPY API', function () {
52
52
 
53
53
  function createOptions (method, url, user) {
54
54
  const options = {
55
- method,
56
- url,
55
+ method: method,
56
+ url: url,
57
57
  headers: {}
58
58
  }
59
59
  if (user) {
@@ -1,5 +1,6 @@
1
1
  import { fileURLToPath } from 'url'
2
2
  import path from 'path'
3
+ import { URL } from 'url'
3
4
  import chai from 'chai'
4
5
  import fs from 'fs-extra'
5
6
  import { fromServerConfig } from '../../lib/models/oidc-manager.mjs'
@@ -37,5 +38,98 @@ describe('OidcManager', () => {
37
38
  expect(oidc.users.backend.path.endsWith('db/oidc/users'))
38
39
  expect(oidc.users.saltRounds).to.equal(saltRounds)
39
40
  })
41
+
42
+ it('should set the provider issuer which is used for iss claim in tokens', () => {
43
+ const providerUri = 'https://pivot-test.solidproject.org:8443'
44
+ const host = SolidHost.from({ serverUri: providerUri })
45
+
46
+ const saltRounds = 5
47
+ const argv = {
48
+ host,
49
+ dbPath,
50
+ saltRounds
51
+ }
52
+
53
+ const oidc = fromServerConfig(argv)
54
+
55
+ // Verify the issuer is set correctly for RFC 9207 compliance
56
+ // The iss claim in tokens should match this issuer value
57
+ expect(oidc.provider.issuer).to.exist
58
+ expect(oidc.provider.issuer).to.not.be.null
59
+ expect(oidc.provider.issuer).to.equal(providerUri)
60
+ console.log('Provider issuer (used for iss claim):', oidc.provider.issuer)
61
+ })
62
+ })
63
+
64
+ describe('RFC 9207 - Authorization redirect with iss parameter', () => {
65
+ it('should include iss parameter when redirecting after authorization', async () => {
66
+ const providerUri = 'https://localhost:8443'
67
+ const host = SolidHost.from({ providerUri })
68
+
69
+ const argv = {
70
+ host,
71
+ dbPath,
72
+ saltRounds: 5
73
+ }
74
+
75
+ const oidc = fromServerConfig(argv)
76
+
77
+ // Dynamically import BaseRequest from oidc-op
78
+ const { default: BaseRequest } = await import('@solid/oidc-op/src/handlers/BaseRequest.js')
79
+
80
+ // Create a mock request/response to test the redirect behavior
81
+ const mockReq = {
82
+ method: 'GET',
83
+ query: {
84
+ response_type: 'code',
85
+ redirect_uri: 'https://app.example.com/callback',
86
+ client_id: 'https://app.example.com',
87
+ state: 'test-state'
88
+ }
89
+ }
90
+
91
+ const mockRes = {
92
+ redirectCalled: false,
93
+ redirectUrl: '',
94
+ redirect (url) {
95
+ this.redirectCalled = true
96
+ this.redirectUrl = url
97
+ }
98
+ }
99
+
100
+ const request = new BaseRequest(mockReq, mockRes, oidc.provider)
101
+ request.params = mockReq.query
102
+
103
+ // Simulate a successful authorization by calling redirect with auth data
104
+ try {
105
+ request.redirect({ code: 'test-auth-code' })
106
+ } catch (err) {
107
+ // The redirect throws a HandledError, which is expected behavior
108
+ // We just need to check that the redirect was called with the right URL
109
+ }
110
+
111
+ expect(mockRes.redirectCalled).to.be.true
112
+ expect(mockRes.redirectUrl).to.exist
113
+
114
+ // Parse the redirect URL to check for iss parameter
115
+ const redirectUrl = new URL(mockRes.redirectUrl)
116
+
117
+ // The iss parameter can be in either the query string or hash fragment
118
+ // depending on the response_mode (query or fragment)
119
+ let issParam = redirectUrl.searchParams.get('iss')
120
+ if (!issParam && redirectUrl.hash) {
121
+ // Check in the hash fragment
122
+ const hashParams = new URLSearchParams(redirectUrl.hash.substring(1))
123
+ issParam = hashParams.get('iss')
124
+ }
125
+
126
+ console.log('Redirect URL:', mockRes.redirectUrl)
127
+ console.log('RFC 9207 - iss parameter in redirect:', issParam)
128
+
129
+ // RFC 9207: The iss parameter MUST be present and match the provider issuer
130
+ expect(issParam, 'RFC 9207: iss parameter must be present in authorization response').to.exist
131
+ expect(issParam).to.not.be.null
132
+ expect(issParam).to.equal(providerUri)
133
+ })
40
134
  })
41
- })
135
+ })
@@ -1 +1 @@
1
- {"redirect_uris":["https://localhost:3457/api/oidc/rp/https%3A%2F%2Flocalhost%3A3457"],"client_id":"5679b38cc39322649b358828e549f081","client_secret":"f629b925f82ee6f962d47e08bc54b6ad","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:3457","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:3457/goodbye"]}
1
+ {"redirect_uris":["https://localhost:3457/api/oidc/rp/https%3A%2F%2Flocalhost%3A3457"],"client_id":"e989e9f58cf29869c56a68ceb4256b69","client_secret":"83b4b30768f1e17b70b54812242c757c","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:3457","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:3457/goodbye"]}
@@ -1 +1 @@
1
- {"provider":{"url":"https://localhost:3457","configuration":{"issuer":"https://localhost:3457","jwks_uri":"https://localhost:3457/jwks","scopes_supported":["openid","offline_access"],"response_types_supported":["code","code token","code id_token","id_token","id_token token","code id_token token","none"],"token_types_supported":["legacyPop","dpop"],"response_modes_supported":["query","fragment"],"grant_types_supported":["authorization_code","implicit","refresh_token","client_credentials"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","RS384","RS512","none"],"token_endpoint_auth_methods_supported":["client_secret_basic"],"token_endpoint_auth_signing_alg_values_supported":["RS256"],"display_values_supported":[],"claim_types_supported":["normal"],"claims_supported":[],"claims_parameter_supported":false,"request_parameter_supported":true,"request_uri_parameter_supported":false,"require_request_uri_registration":false,"check_session_iframe":"https://localhost:3457/session","end_session_endpoint":"https://localhost:3457/logout","authorization_endpoint":"https://localhost:3457/authorize","token_endpoint":"https://localhost:3457/token","userinfo_endpoint":"https://localhost:3457/userinfo","registration_endpoint":"https://localhost:3457/register"},"jwks":{"keys":[{"kid":"lNZOB-DPE1k","kty":"RSA","alg":"RS256","n":"uvih8HfZj7Wu5Y8knLHxRY6v7oHL2jXWD-B6hXCreYhwaG9EEUt6Rp94p8-JBug3ywo8C_9dNg0RtQLEttcIC_vhqqlJI3pZxpGKXuD9h7XK-PppFVvgnfIGADG0Z-WzbcGDxlefStohR31Hjw5U3ioG3VtXGAYbqlOHM1l2UgDMJwBD5qwFmPP8gp5E2WQKCsuLvxDuOrkAbSDjw2zaI3RRmbLzdj4QkGej8GXhBptgM9RwcKmnoXu0sUdlootmcdiEg74yQ9M6EshNMhiv4k_W0rl7RqVOEL2PsAdmdbF_iWL8a90rGYOEILBrlU6bBR2mTvjV_Hvq-ifFy1YAmQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"Y38YKDtydoE","kty":"RSA","alg":"RS384","n":"tfgZKLjc8UMIblfAlVibJI_2uAxDNprn2VVLebS0sp6d1mtCXQkMYLlJ6e-7kavl8we391Ovnq5bRgpsFRq_LtRX9MpVlfioAUHwWPEG-R6vrQjgo4uynVhI3UEPHyNmZA5J4u34HNVTfAgmquomwwOmOv29ZNRxuYP1kVtscz1JeFPwg6LA7BxWrLc9ev4FQR6tjJKdo2kdLjAXR92odbCzJZ_jdYT3vIVCexMHxhoKnqCImkhfgKbGXcPHXWcelmuA2tzBaLut-Jjo0nJVQjRNDqy0Gyac0TptwFIxaiyHeTqugolUmEaJSfBSLszIRdlOTIGPJ7zdg5dJFK_Lxw","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"WyMVv6BJ5Dk","kty":"RSA","alg":"RS512","n":"5JDlpbm2TjSW1wpdUZc5NHOqVVrNH_GumoODK_mk-MqImaIRpdR9b1ZJrK6FrW7HIF2bXvebD7olmp9a1goqe-ILbL_ORmhzlhRtyhjWQ-UOZqK5yOXqXXGQXgmok6TN-s55A-h_g12A7Yk5Y5S8EVa9EA4Axwqvm-Q_AkH0yS1qJo6BXYXb1fx205ucx-Ccot2LEBfxv8M7NOFTa-_G-sNchiKQMRoLhbZtLbSK2R1jkqGciEiRSLeXNG4nDu7Wd91-vhBixA1McxnzW96mW8lQwNXXo4gNH7SjONtYLlPQhZVEbmsQmXrOQN8a5RDkybFOIsbucItizSE9V_D7WQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"UykSj_HLgFA","kty":"RSA","alg":"RS256","n":"u79eQlGJN2XFNR-uEmPVtrB_ENRqaS81o6m63tZ5-PwhGHCwJ7rfVnnnvf6Ij_p91Z9pNpWBIVyZcw6UmQIoIBH-3BfxdaqhBxX9bf_N78TKj8_HU5IYjGijale4gog3kj9W2tJJO7R9iA43msjwLRD7pbAHp1iKFJgVTSXJlyLRbC82Dj4ivsEgJjPGvZt16OsGP5myIQwXEGzSPcEI0R9daZE5iM6xFZosaJ8B77eU-Aj3ciwxUBPi5BSZi2P1ZsF4QgSj3N7ZLbVKNW4FFr84IamA2YI0D7PyyNAE2PUZT8n0jHWRJKunuZuy5mgBY8H41KdBI6gNJqY90nHeJw","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"BJDNTt8RpPE","kty":"RSA","alg":"RS384","n":"nXTd5AoT220nBkW6Zeax8caUI7_Tt0y4v9TEW8TOrzCVvhLBiKpQPjILUTfkGHzxPtysEzDQFSYdHWvg_fvGYItjJBunBMsKCNcb2_CDr2HXD6C0s62bAgct8bBSoaT1MLQ_3MaFKXSF3ZuB87X2B8CVUJ386HP2GY1kl54BuMdFELNZYhy9S_D0KHnQls52Vvb99X9WaYOyxvfr03PG-9EycnkWas5tn1pPFzT0DtJtBJ4IBtXQxTr98jpn_MCz1gRnMgzzkfSOcrMkkMXxePqxNINVKFXtRy7DaJiFOcCMbuK2RJUkSfY2uKcx0aKbp5Xhvix1W8N7c0Y90i6_6w","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"z8iijSOOIs4","kty":"RSA","alg":"RS512","n":"rPCHP9XeTGOLf1Ezxeq_bdGdvYQZa993YcSVudT0EN6drTWqjykhUVEkT4MGAvLvax38kLARbPUTgMUV9UckDDWn6lRq4q6IZ5pytNOieQKZHzjEmQGzlbnEn1F2m1i5SAfBL-qsnt5q2RXMAiIUXk9q1ChJEHJxOZxnRIoQMc7yTsjjSdtIZKePFiYFn0nsl3A234ByyIBRjzZeoYEtTQKjDR7fP9LO78oZAgpwoGqmfI4IltqQYkFoqrN8I8l1yiJGyuvZRgDXUZ2fxGOQx2WD4xvlFL2TOCfN1UaPE9R4JdbRLLAOf5u1Sqnh4XTjDBhBbVodsmmbtvk4wFo-GQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"zD76wa11A2Y","kty":"RSA","alg":"RS256","n":"nMaSioq1An1J3tbkmc-zRrR8lkbP-WUVRuYhDxQvV-OcBw1R6cdyCcoeFJ1zuUT7ne6BlU6GMPRHuRKaH0KuOaiktUYtXm06T_HvtKFgCQSAKjMUj_ZHfTAJP8ahUsIc0D995XKp7nIGRF7Iy7I24QQFPRh7PmGlREZ52GJgYQgbm020-sWani0MqHoUFBlWxZW9NEqY1c3brN_qWnzjRKly6Kkk3sW1XHPcRLvoHnHQ6TKXJ8pfl-bNjTfK6zq9fDCZ_TY3qQZy66yT_2XPO6X0GHTdJsZlCj7Jg0qrilTHUkJra1bppTSAtVSQnSmYt_IV8zOYiVdJ3kw2khPcKw","e":"AQAB","key_ops":["verify"],"ext":true}]}},"defaults":{},"registration":{"redirect_uris":["https://localhost:3457/api/oidc/rp/https%3A%2F%2Flocalhost%3A3457"],"client_id":"5679b38cc39322649b358828e549f081","client_secret":"f629b925f82ee6f962d47e08bc54b6ad","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:3457","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:3457/goodbye"],"registration_access_token":"eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2xvY2FsaG9zdDozNDU3IiwiYXVkIjoiNTY3OWIzOGNjMzkzMjI2NDliMzU4ODI4ZTU0OWYwODEiLCJzdWIiOiI1Njc5YjM4Y2MzOTMyMjY0OWIzNTg4MjhlNTQ5ZjA4MSJ9.MpuY81L7hTqnkPYlNqb7K-Xi2iQypO85NJHle2K0lytw_OHiqJuViPzreXhPLA1zKsHzzX6km63w0U321mBu9zXrzeIFmUI0Jnld_sB6nRkdRWM0D--fw4iNJFPP-oe1n2y_f-7yzvgbRq3PimIgldpUPb_gRfAc5WiI6LiB2aAXuCTtlQiU4d6BvqIuMv0m1eha1sBWX7cqarMri9tQX5JrAmixWRXpmUI-R1ZCTkboVhNcxrlQ7nqXlD_7btsY55ww4XfeeTYJ9Ywq0JJnKvOu8Shz4se0cka0vivyOzurx6tWHbezpDH6a05QjOsMu-yIYxHnyIBesRfyYPCd9w","registration_client_uri":"https://localhost:3457/register/5679b38cc39322649b358828e549f081","client_id_issued_at":1766874050,"client_secret_expires_at":0},"store":{}}
1
+ {"provider":{"url":"https://localhost:3457","configuration":{"issuer":"https://localhost:3457","jwks_uri":"https://localhost:3457/jwks","scopes_supported":["openid","offline_access"],"response_types_supported":["code","code token","code id_token","id_token","id_token token","code id_token token","none"],"token_types_supported":["legacyPop","dpop"],"response_modes_supported":["query","fragment"],"grant_types_supported":["authorization_code","implicit","refresh_token","client_credentials"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","RS384","RS512","none"],"token_endpoint_auth_methods_supported":["client_secret_basic"],"token_endpoint_auth_signing_alg_values_supported":["RS256"],"display_values_supported":[],"claim_types_supported":["normal"],"claims_supported":[],"claims_parameter_supported":false,"request_parameter_supported":true,"request_uri_parameter_supported":false,"require_request_uri_registration":false,"check_session_iframe":"https://localhost:3457/session","end_session_endpoint":"https://localhost:3457/logout","authorization_endpoint":"https://localhost:3457/authorize","token_endpoint":"https://localhost:3457/token","userinfo_endpoint":"https://localhost:3457/userinfo","registration_endpoint":"https://localhost:3457/register"},"jwks":{"keys":[{"kid":"lNZOB-DPE1k","kty":"RSA","alg":"RS256","n":"uvih8HfZj7Wu5Y8knLHxRY6v7oHL2jXWD-B6hXCreYhwaG9EEUt6Rp94p8-JBug3ywo8C_9dNg0RtQLEttcIC_vhqqlJI3pZxpGKXuD9h7XK-PppFVvgnfIGADG0Z-WzbcGDxlefStohR31Hjw5U3ioG3VtXGAYbqlOHM1l2UgDMJwBD5qwFmPP8gp5E2WQKCsuLvxDuOrkAbSDjw2zaI3RRmbLzdj4QkGej8GXhBptgM9RwcKmnoXu0sUdlootmcdiEg74yQ9M6EshNMhiv4k_W0rl7RqVOEL2PsAdmdbF_iWL8a90rGYOEILBrlU6bBR2mTvjV_Hvq-ifFy1YAmQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"Y38YKDtydoE","kty":"RSA","alg":"RS384","n":"tfgZKLjc8UMIblfAlVibJI_2uAxDNprn2VVLebS0sp6d1mtCXQkMYLlJ6e-7kavl8we391Ovnq5bRgpsFRq_LtRX9MpVlfioAUHwWPEG-R6vrQjgo4uynVhI3UEPHyNmZA5J4u34HNVTfAgmquomwwOmOv29ZNRxuYP1kVtscz1JeFPwg6LA7BxWrLc9ev4FQR6tjJKdo2kdLjAXR92odbCzJZ_jdYT3vIVCexMHxhoKnqCImkhfgKbGXcPHXWcelmuA2tzBaLut-Jjo0nJVQjRNDqy0Gyac0TptwFIxaiyHeTqugolUmEaJSfBSLszIRdlOTIGPJ7zdg5dJFK_Lxw","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"WyMVv6BJ5Dk","kty":"RSA","alg":"RS512","n":"5JDlpbm2TjSW1wpdUZc5NHOqVVrNH_GumoODK_mk-MqImaIRpdR9b1ZJrK6FrW7HIF2bXvebD7olmp9a1goqe-ILbL_ORmhzlhRtyhjWQ-UOZqK5yOXqXXGQXgmok6TN-s55A-h_g12A7Yk5Y5S8EVa9EA4Axwqvm-Q_AkH0yS1qJo6BXYXb1fx205ucx-Ccot2LEBfxv8M7NOFTa-_G-sNchiKQMRoLhbZtLbSK2R1jkqGciEiRSLeXNG4nDu7Wd91-vhBixA1McxnzW96mW8lQwNXXo4gNH7SjONtYLlPQhZVEbmsQmXrOQN8a5RDkybFOIsbucItizSE9V_D7WQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"UykSj_HLgFA","kty":"RSA","alg":"RS256","n":"u79eQlGJN2XFNR-uEmPVtrB_ENRqaS81o6m63tZ5-PwhGHCwJ7rfVnnnvf6Ij_p91Z9pNpWBIVyZcw6UmQIoIBH-3BfxdaqhBxX9bf_N78TKj8_HU5IYjGijale4gog3kj9W2tJJO7R9iA43msjwLRD7pbAHp1iKFJgVTSXJlyLRbC82Dj4ivsEgJjPGvZt16OsGP5myIQwXEGzSPcEI0R9daZE5iM6xFZosaJ8B77eU-Aj3ciwxUBPi5BSZi2P1ZsF4QgSj3N7ZLbVKNW4FFr84IamA2YI0D7PyyNAE2PUZT8n0jHWRJKunuZuy5mgBY8H41KdBI6gNJqY90nHeJw","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"BJDNTt8RpPE","kty":"RSA","alg":"RS384","n":"nXTd5AoT220nBkW6Zeax8caUI7_Tt0y4v9TEW8TOrzCVvhLBiKpQPjILUTfkGHzxPtysEzDQFSYdHWvg_fvGYItjJBunBMsKCNcb2_CDr2HXD6C0s62bAgct8bBSoaT1MLQ_3MaFKXSF3ZuB87X2B8CVUJ386HP2GY1kl54BuMdFELNZYhy9S_D0KHnQls52Vvb99X9WaYOyxvfr03PG-9EycnkWas5tn1pPFzT0DtJtBJ4IBtXQxTr98jpn_MCz1gRnMgzzkfSOcrMkkMXxePqxNINVKFXtRy7DaJiFOcCMbuK2RJUkSfY2uKcx0aKbp5Xhvix1W8N7c0Y90i6_6w","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"z8iijSOOIs4","kty":"RSA","alg":"RS512","n":"rPCHP9XeTGOLf1Ezxeq_bdGdvYQZa993YcSVudT0EN6drTWqjykhUVEkT4MGAvLvax38kLARbPUTgMUV9UckDDWn6lRq4q6IZ5pytNOieQKZHzjEmQGzlbnEn1F2m1i5SAfBL-qsnt5q2RXMAiIUXk9q1ChJEHJxOZxnRIoQMc7yTsjjSdtIZKePFiYFn0nsl3A234ByyIBRjzZeoYEtTQKjDR7fP9LO78oZAgpwoGqmfI4IltqQYkFoqrN8I8l1yiJGyuvZRgDXUZ2fxGOQx2WD4xvlFL2TOCfN1UaPE9R4JdbRLLAOf5u1Sqnh4XTjDBhBbVodsmmbtvk4wFo-GQ","e":"AQAB","key_ops":["verify"],"ext":true},{"kid":"zD76wa11A2Y","kty":"RSA","alg":"RS256","n":"nMaSioq1An1J3tbkmc-zRrR8lkbP-WUVRuYhDxQvV-OcBw1R6cdyCcoeFJ1zuUT7ne6BlU6GMPRHuRKaH0KuOaiktUYtXm06T_HvtKFgCQSAKjMUj_ZHfTAJP8ahUsIc0D995XKp7nIGRF7Iy7I24QQFPRh7PmGlREZ52GJgYQgbm020-sWani0MqHoUFBlWxZW9NEqY1c3brN_qWnzjRKly6Kkk3sW1XHPcRLvoHnHQ6TKXJ8pfl-bNjTfK6zq9fDCZ_TY3qQZy66yT_2XPO6X0GHTdJsZlCj7Jg0qrilTHUkJra1bppTSAtVSQnSmYt_IV8zOYiVdJ3kw2khPcKw","e":"AQAB","key_ops":["verify"],"ext":true}]}},"defaults":{},"registration":{"redirect_uris":["https://localhost:3457/api/oidc/rp/https%3A%2F%2Flocalhost%3A3457"],"client_id":"e989e9f58cf29869c56a68ceb4256b69","client_secret":"83b4b30768f1e17b70b54812242c757c","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:3457","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:3457/goodbye"],"registration_access_token":"eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL2xvY2FsaG9zdDozNDU3IiwiYXVkIjoiZTk4OWU5ZjU4Y2YyOTg2OWM1NmE2OGNlYjQyNTZiNjkiLCJzdWIiOiJlOTg5ZTlmNThjZjI5ODY5YzU2YTY4Y2ViNDI1NmI2OSJ9.QMK440DC5sYY5ArnaA_K5NkJ9lDVup3mw0fXUfiM0lHpaflb6bkyAPU8WQ5qYKTlwE_eaNkHqXRugo46ImlexqvyhUzXsrf2jXUBLbAtBVJ48JQ1pICntm5x2hAntTqcvFj5xKTPGb8DbiN7Tu71igSj5EjoIETQDPh75bbNBSe-qabAsWiZiPIQkJz90A7H4DyYQ3MNMeXkRhbNMwB4V0dKUUdMn1N8tTpkT2zyKQ8OYqTlX8xWcT5Zro0CBY-CiEZqFTaGMNlD2WfLLaJPRanuzgBP898zzfUtw9ABsc-H5KWc0hYEXBhmobPAK0BhvhMbf9fHzXyx-J2-p1tZzw","registration_client_uri":"https://localhost:3457/register/e989e9f58cf29869c56a68ceb4256b69","client_id_issued_at":1767346119,"client_secret_expires_at":0},"store":{}}
@@ -1 +1 @@
1
- {"redirect_uris":["https://localhost:7000/api/oidc/rp/https%3A%2F%2Flocalhost%3A7000"],"client_id":"cbb43052dfa98178e38cdbc019e04265","client_secret":"c0ded015927eba4dbc4ddf3e9bd73e29","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:7000","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:7000/goodbye"]}
1
+ {"redirect_uris":["https://localhost:7000/api/oidc/rp/https%3A%2F%2Flocalhost%3A7000"],"client_id":"a31de046443144df66179553447ffed2","client_secret":"71e7cb977973f1095ffbcfdaec210bac","response_types":["code","id_token token","code id_token token"],"grant_types":["authorization_code","implicit","refresh_token","client_credentials"],"application_type":"web","client_name":"Solid OIDC RP for https://localhost:7000","id_token_signed_response_alg":"RS256","token_endpoint_auth_method":"client_secret_basic","default_max_age":86400,"post_logout_redirect_uris":["https://localhost:7000/goodbye"]}