diff --git a/oauth3.issuer.js b/oauth3.issuer.js index abd5395..e09aadf 100644 --- a/oauth3.issuer.js +++ b/oauth3.issuer.js @@ -283,7 +283,7 @@ OAUTH3.urls.publishKey = function (directive, opts) { return { method: jwkDir.method || opts.method || 'POST' , url: url - , data: opts.public_key + , data: opts.public_key || opts.publicKey , session: opts.session }; }; @@ -605,6 +605,48 @@ OAUTH3.hooks.keyPairs = { return OAUTH3.PromiseA.resolve(OAUTH3._hooks.keyPairs.clear()); } }; +OAUTH3.hooks.session.get = function (providerUri, id) { + OAUTH3.hooks._checkStorage('sessions', 'get'); + var sessProm = OAUTH3.PromiseA.resolve(OAUTH3._hooks.sessions.get(providerUri, id)); + if (providerUri !== OAUTH3.clientUri(window.location)) { + return sessProm; + } + + return sessProm.then(function (session) { + if (session && OAUTH3.jwt.freshness(session.token) === 'fresh') { + return session; + } + + return OAUTH3.hooks.keyPairs.all().then(function (keyPairs) { + var pair; + if (id) { + pair = keyPairs[id]; + } else if (Object.keys(keyPairs).length === 1) { + id = Object.keys(keyPairs)[0]; + pair = keyPairs[id]; + } else if (Object.keys(keyPairs).length > 1) { + console.error("too many users, don't know which key to use"); + } + if (!pair) { + return null; + } + + var payload = { + iss: providerUri + , aud: providerUri + , azp: providerUri + , sub: pair.sub || id + , scope: '' + }; + return OAUTH3.jwt.sign(payload, pair.privateKey).then(function (token) { + return OAUTH3.hooks.session.refresh( + { provider_uri: providerUri, client_uri: providerUri || providerUri } + , { access_token: token } + ); + }); + }); + }); +}; OAUTH3._defaultStorage.grants = { prefix: 'grants-'