Skip to content

Commit 66cab48

Browse files
Add registerClient(), refactor
1 parent 76aec13 commit 66cab48

File tree

4 files changed

+88
-53
lines changed

4 files changed

+88
-53
lines changed

src/multi-rp-client.js

Lines changed: 63 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
'use strict'
22
const ClientStore = require('./store')
3+
const OIDCExpressClient = require('anvil-connect-express')
4+
const DEFAULT_MAX_AGE = 86400
35

46
class MultiRpClient {
57
constructor (options = {}) {
@@ -8,63 +10,79 @@ class MultiRpClient {
810
this.debug = options.debug || console.log.bind(console)
911
}
1012

11-
/**
12-
* @method clientRegistrationConfig
13-
* @static
14-
* @param issuer {String} URL of the OIDC Provider / issuer.
15-
* @param redirectUris {Array<String>} List of allowed URIs to which the
16-
* provider will redirect users after login etc.
17-
* @param [postLogoutUris] {Array<String>}
18-
* @return {Object} OIDC Client registration config options
19-
*/
20-
static clientRegistrationConfig (issuer, redirectUris, postLogoutUris) {
21-
let clientName = `Solid OIDC Client for ${issuer}`
22-
let config = {
23-
client_name: clientName,
24-
// client_uri: 'https://github.com/solid/node-solid-server',
25-
// logo_uri: 'solid logo',
26-
// post_logout_redirect_uris: [ '...' ],
27-
default_max_age: 86400, // one day in seconds
28-
// trusted: true,
29-
// Type of token requests that this client is gonna make
30-
grant_types: ['authorization_code', 'implicit',
31-
'refresh_token', 'client_credentials'],
32-
issuer: issuer,
33-
redirect_uris: redirectUris,
34-
response_types: ['code', 'id_token token', 'code id_token token'],
35-
scope: 'openid profile'
36-
}
37-
if (postLogoutUris) {
38-
config.post_logout_redirect_uris = postLogoutUris
39-
}
40-
return config
41-
}
42-
43-
clientForIssuer (issuer) {
13+
clientForIssuer (issuerUri) {
4414
let debug = this.debug
45-
// var trustedClient = this.trustedClient.client
46-
// var baseRedirectUri = trustedClient.redirect_uri
47-
// var isTrustedClient = issuer === trustedClient.issuer
48-
return this.store.get(issuer)
49-
.then((client) => {
15+
return this.store.get(issuerUri)
16+
.then(client => {
5017
debug('Client fetched for issuer.')
5118
if (client) {
5219
return client
5320
}
5421
debug('Client not present, initializing new client.')
5522
// client not already in store, create and register it
56-
// let redirectUri = this.redirectUriForIssuer(issuer,
57-
// baseRedirectUri, isTrustedClient)
58-
// let clientConfig = {
59-
// issuer: issuer,
60-
// redirect_uri: redirectUri
61-
// }
62-
// return this.initClient(clientConfig, isTrustedClient)
23+
let registrationConfig = this.registrationConfigFor(issuerUri)
24+
return this.registerClient(registrationConfig)
25+
})
26+
.then(registeredClient => {
27+
// Store and return the newly registered client
28+
return this.store.put(registeredClient)
6329
})
6430
}
6531

6632
get localIssuer () {
6733
return this.localConfig.issuer
6834
}
35+
36+
/**
37+
* @method redirectUriForIssuer
38+
* @param issuer {string} Issuer URI
39+
* @param baseUri {string}
40+
* @returns {string}
41+
*/
42+
redirectUriForIssuer (issuerUri, baseUri = this.localConfig.redirect_uri) {
43+
let issuerId = encodeURIComponent(issuerUri)
44+
return `${baseUri}/${issuerId}`
45+
}
46+
47+
registerClient (config) {
48+
let debug = this.debug
49+
let oidcExpress = new OIDCExpressClient(config)
50+
debug.oidc('Running client.initProvider()...')
51+
return oidcExpress.client.initProvider()
52+
.then(() => {
53+
debug.oidc('Client discovered, JWKs retrieved')
54+
if (!oidcExpress.client.client_id) {
55+
// Register if you haven't already.
56+
debug.oidc('Registering client')
57+
return oidcExpress.client.register(config)
58+
} else {
59+
// Already registered.
60+
return oidcExpress
61+
}
62+
})
63+
}
64+
65+
/**
66+
* @param issuer {string} URL of the OIDC Provider / issuer.
67+
* @param [config={}] {Object}
68+
*/
69+
registrationConfigFor (issuer, config = {}) {
70+
let redirectUri = config.redirect_uri || this.redirectUriForIssuer(issuer)
71+
let defaultClientName = `Solid OIDC RP for ${issuer}`
72+
73+
config.client_name = config.client_name || defaultClientName
74+
config.default_max_age = config.default_max_age || DEFAULT_MAX_AGE
75+
config.issuer = issuer
76+
config.grant_types = config.grant_types ||
77+
['authorization_code', 'implicit', 'refresh_token', 'client_credentials']
78+
config.redirect_uris = config.redirect_uris || [ redirectUri ]
79+
config.response_types = config.response_types ||
80+
['code', 'id_token token', 'code id_token token']
81+
config.scope = config.scope || 'openid profile'
82+
// client_uri: 'https://github.com/solid/node-solid-server',
83+
// logo_uri: 'solid logo',
84+
// post_logout_redirect_uris: [ '...' ],
85+
return config
86+
}
6987
}
7088
module.exports = MultiRpClient

src/store.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module.exports = class OIDCClientStore {
66
return Promise.resolve()
77
.then(() => {
88
this.clients[expressClient.client.issuer] = expressClient
9+
return expressClient
910
})
1011
}
1112
get (issuer) {

test/unit/client-store-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ test('client store and retrieve test', t => {
1313
}
1414
}
1515
store.put(expressClient)
16-
.then(() => {
16+
.then((storedClient) => {
17+
t.equal(storedClient, expressClient,
18+
'store.put() should return the stored client')
1719
return store.get(issuerUrl)
1820
})
1921
.then(retrievedClient => {

test/unit/multi-rp-client-test.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,19 @@ test('MultiRpClient constructor test', t => {
1818
t.end()
1919
})
2020

21-
test('MultiRpClient.clientRegistrationConfig() test', t => {
21+
test('MultiRpClient.registrationConfigFor() test', t => {
2222
let issuer = 'https://oidc.example.com'
23-
let redirectUris = [ 'https://localhost:8443/callback' ]
24-
let postLogoutUris = [ 'https://localhost:8443/signed_out.html' ]
25-
let regConfig =
26-
MultiRpClient.clientRegistrationConfig(issuer, redirectUris, postLogoutUris)
23+
let localConfig = {
24+
issuer: issuer,
25+
redirect_uri: 'https://localhost:8443/rp'
26+
}
27+
let multiClient = new MultiRpClient({ localConfig })
28+
let regConfig = multiClient.registrationConfigFor(issuer)
2729
t.ok(regConfig.client_name)
2830
// Check for other claims here...
2931
t.equal(regConfig.issuer, issuer)
30-
t.equal(regConfig.redirect_uris, redirectUris)
31-
t.equal(regConfig.post_logout_redirect_uris, postLogoutUris)
32+
t.deepEqual(regConfig.redirect_uris,
33+
[ 'https://localhost:8443/rp/https%3A%2F%2Foidc.example.com' ])
3234
t.end()
3335
})
3436

@@ -49,3 +51,15 @@ test('MultiRpClient.clientForIssuer() - client exists in store test', t => {
4951
})
5052
.catch(err => { t.fail(err) })
5153
})
54+
55+
test('MultiRpClient.redirectUriForIssuer() test', t => {
56+
let localRedirectUri = 'https://oidc.example.com/rp'
57+
let localConfig = {
58+
redirect_uri: localRedirectUri
59+
}
60+
let multiClient = new MultiRpClient({ localConfig })
61+
let otherIssuer = 'https://issuer.com'
62+
let issuerRedirectUri = multiClient.redirectUriForIssuer(otherIssuer)
63+
t.equal(issuerRedirectUri, 'https://oidc.example.com/rp/https%3A%2F%2Fissuer.com')
64+
t.end()
65+
})

0 commit comments

Comments
 (0)