11'use strict'
22const ClientStore = require ( './store' )
3+ const OIDCExpressClient = require ( 'anvil-connect-express' )
4+ const DEFAULT_MAX_AGE = 86400
35
46class 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}
7088module . exports = MultiRpClient
0 commit comments