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.
- package/common/js/index-buttons.mjs +8 -3
- package/coverage/tmp/coverage-2270-1767346136095-0.json +1 -0
- package/coverage/tmp/{coverage-2329-1766874045743-0.json → coverage-2271-1767346114541-0.json} +1 -1
- package/eslint.config.mjs +1 -1
- package/lib/acl-checker.mjs +2 -1
- package/lib/create-server.mjs +2 -2
- package/lib/handlers/cors-proxy.mjs +2 -2
- package/lib/handlers/get.mjs +9 -13
- package/lib/ldp.mjs +3 -2
- package/lib/models/account-manager.mjs +1 -1
- package/lib/utils.mjs +1 -1
- package/lib/webid/lib/get.mjs +1 -0
- package/package.json +33 -19
- package/solid-server-5.8.8.tgz +0 -0
- package/test/index.mjs +3 -2
- package/test/integration/acl-oidc-test.mjs +2 -1
- package/test/integration/authentication-oidc-test.mjs +6 -10
- package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +9 -14
- package/test/integration/http-copy-test.mjs +2 -2
- package/test/integration/oidc-manager-test.mjs +95 -1
- package/test/resources/accounts/db/oidc/op/clients/{_key_5679b38cc39322649b358828e549f081.json → _key_e989e9f58cf29869c56a68ceb4256b69.json} +1 -1
- package/test/resources/accounts/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A3457.json +1 -1
- package/test/resources/accounts-scenario/alice/db/oidc/op/clients/{_key_cbb43052dfa98178e38cdbc019e04265.json → _key_a31de046443144df66179553447ffed2.json} +1 -1
- package/test/resources/accounts-scenario/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7000.json +1 -1
- package/test/resources/accounts-scenario/bob/db/oidc/op/clients/{_key_36a0d4102cba4fe51c5fe4a16081e9e9.json → _key_cf92a9f132c1973db4163b653050ac5f.json} +1 -1
- package/test/resources/accounts-scenario/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7001.json +1 -1
- package/test/resources/accounts-scenario/charlie/db/oidc/op/clients/{_key_4c0c9486e322b53857ab916a14ca0c7c.json → _key_25fe3c0bf640a75aecd0ccb1c2951eb1.json} +1 -1
- package/test/resources/accounts-scenario/charlie/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A5002.json +1 -1
- package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/clients/{_key_714755e5bd0de8bb6887def74e169a31.json → _key_1a5ed3aa47de01ee7438f2537e1b5331.json} +1 -1
- package/test/resources/accounts-strict-origin-off/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7010.json +1 -1
- package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/clients/{_key_4b633db2888c8406109667552ff9e46e.json → _key_30b67c31ec6753bde889bbb157e879c5.json} +1 -1
- package/test/resources/accounts-strict-origin-off/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7011.json +1 -1
- package/test/unit/create-account-request-test.mjs +1 -1
- package/test/unit/utils-test.mjs +3 -1
- package/test/utils/index.mjs +3 -2
- package/test/utils.mjs +3 -2
- package/coverage/tmp/coverage-2328-1766874068095-0.json +0 -1
package/eslint.config.mjs
CHANGED
package/lib/acl-checker.mjs
CHANGED
|
@@ -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
|
|
311
|
+
const response = await httpFetch(url)
|
|
311
312
|
body = await response.text()
|
|
312
313
|
contentType = response.headers.get('content-type')
|
|
313
314
|
}
|
package/lib/create-server.mjs
CHANGED
|
@@ -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
|
|
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 (
|
|
76
|
+
if (isIp(hostname)) {
|
|
77
77
|
addProxyConfig(null, hostname)
|
|
78
78
|
} else {
|
|
79
79
|
dns.lookup(hostname, addProxyConfig)
|
package/lib/handlers/get.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { createRequire } from 'module'
|
|
4
4
|
import fs from 'fs'
|
|
5
|
-
import
|
|
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
|
-
|
|
192
|
-
|
|
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
|
-
}
|
|
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
|
|
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
|
}
|
package/lib/utils.mjs
CHANGED
package/lib/webid/lib/get.mjs
CHANGED
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-
|
|
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": "^
|
|
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.
|
|
66
|
-
"@solid/oidc-op": "^0.12.
|
|
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": "^
|
|
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": "^
|
|
87
|
-
"get-folder-size": "^
|
|
88
|
-
"glob": "^
|
|
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": "^
|
|
97
|
+
"is-ip": "^2.0.0",
|
|
96
98
|
"li": "^1.3.0",
|
|
97
99
|
"mashlib": "^1.11.1",
|
|
98
|
-
"mime-types": "^
|
|
99
|
-
"negotiator": "^
|
|
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": "^
|
|
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": "^
|
|
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
|
-
"
|
|
130
|
-
"globals": "^16.5.0",
|
|
132
|
+
"globals": "^17.0.0",
|
|
131
133
|
"localstorage-memory": "1.0.3",
|
|
132
|
-
"mocha": "^
|
|
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": "^
|
|
142
|
+
"supertest": "^6.3.4",
|
|
141
143
|
"turtle-validator": "1.1.1",
|
|
142
|
-
"whatwg-url": "
|
|
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
|
|
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
|
},
|
package/solid-server-5.8.8.tgz
CHANGED
|
Binary file
|
package/test/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'fs-extra'
|
|
2
|
-
import
|
|
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
|
|
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')
|
|
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
|
-
|
|
689
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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')
|
|
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
|
-
|
|
510
|
-
|
|
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
|
|
539
|
-
const
|
|
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(
|
|
541
|
+
expect(postLoginUri.startsWith(aliceServerUri + '/authorize'))
|
|
546
542
|
.to.be.true()
|
|
547
543
|
|
|
548
|
-
return fetch(
|
|
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
|
-
|
|
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
|
})
|
|
@@ -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":"
|
|
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":"
|
|
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":"
|
|
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"]}
|