This commit is contained in:
AJ ONeal 2017-02-21 14:18:09 -07:00
parent c356d61598
commit ae97b30b6f
1 changed files with 40 additions and 32 deletions

View File

@ -4,7 +4,7 @@
var OAUTH3 = exports.OAUTH3 = {
clientUri: function (location) {
return OAUTH3.utils.uri.normalize(location.host + location.pathname);
return OAUTH3.uri.normalize(location.host + location.pathname);
}
, error: {
parse: function (providerUri, params) {
@ -83,7 +83,7 @@
}
if ('scope' === key) {
params[key] = OAUTH3.utils.scope.stringify(params[key]);
params[key] = OAUTH3.scope.stringify(params[key]);
}
qs.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
@ -171,8 +171,8 @@
if (!opts.client_id) {
throw new Error("cannot discover without options.client_id");
}
var clientId = OAUTH3.utils.url.normalize(opts.client_id || opts.client_uri);
providerUri = OAUTH3.utils.url.normalize(providerUri);
var clientId = OAUTH3.url.normalize(opts.client_id || opts.client_uri);
providerUri = OAUTH3.url.normalize(providerUri);
var params = {
action: 'directives'
@ -185,7 +185,7 @@
};
var result = {
url: providerUri + '/.well-known/oauth3/#/?' + OAUTH3.utils.query.stringify(params)
url: providerUri + '/.well-known/oauth3/#/?' + OAUTH3.query.stringify(params)
, state: params.state
, method: 'GET'
, query: params
@ -226,20 +226,20 @@
params.response_type = responseType;
if (scope) {
params.scope = OAUTH3.utils.scope.stringify(scope);
params.scope = OAUTH3.scope.stringify(scope);
}
if (!opts.redirect_uri) {
// TODO consider making this optional
//console.warn("auto-generating redirect_uri from hard-coded callback.html"
// + " (should be configurable... but then redirect_uri could just be manually-generated)");
opts.redirect_uri = OAUTH3.utils.url.resolve(
OAUTH3.utils.url.normalize(params.client_uri)
opts.redirect_uri = OAUTH3.url.resolve(
OAUTH3.url.normalize(params.client_uri)
, '.well-known/oauth3/callback.html'
);
}
params.redirect_uri = opts.redirect_uri;
uri += '?' + OAUTH3.utils.query.stringify(params);
uri += '?' + OAUTH3.query.stringify(params);
result = {
url: uri
@ -287,11 +287,11 @@
}
if (scope) {
params.scope = OAUTH3.utils.scope.stringify(scope);
params.scope = OAUTH3.scope.stringify(scope);
}
if ('GET' === args.method.toUpperCase()) {
uri += '?' + OAUTH3.utils.query.stringify(params);
uri += '?' + OAUTH3.query.stringify(params);
} else {
body = params;
}
@ -326,8 +326,8 @@
, client_id: opts.client_id || opts.client_uri
, client_uri: opts.client_uri || opts.client_id
, state: state
, redirect_uri: opts.redirect_uri = OAUTH3.utils.url.resolve(
OAUTH3.utils.url.normalize(opts.client_uri || opts.client_id)
, redirect_uri: opts.redirect_uri = OAUTH3.url.resolve(
OAUTH3.url.normalize(opts.client_uri || opts.client_id)
, '.well-known/oauth3/callback.html'
)
, debug: opts.debug
@ -336,13 +336,13 @@
var body;
if ('GET' === args.method.toUpperCase()) {
uri += '?' + OAUTH3.utils.query.stringify(params);
uri += '?' + OAUTH3.query.stringify(params);
} else {
body = params;
}
return {
url: OAUTH3.utils.url.resolve(directive.issuer, uri)
url: OAUTH3.url.resolve(directive.issuer, uri)
, method: args.method
, state: state
, data: body
@ -352,7 +352,7 @@
, hooks: {
directives: {
_get: function (providerUri) {
providerUri = OAUTH3.utils.uri.normalize(providerUri);
providerUri = OAUTH3.uri.normalize(providerUri);
if (!OAUTH3.hooks.directives._cache) { OAUTH3.hooks.directives._cache = {}; }
return OAUTH3.PromiseA.resolve(OAUTH3.hooks.directives._cache[providerUri]
|| OAUTH3.hooks.directives.get(providerUri))
@ -363,7 +363,7 @@
});
}
, _getCached: function (providerUri) {
providerUri = OAUTH3.utils.uri.normalize(providerUri);
providerUri = OAUTH3.uri.normalize(providerUri);
return OAUTH3.hooks.directives._cache[providerUri];
}
, get: function (providerUri) {
@ -371,7 +371,7 @@
return JSON.parse(window.localStorage.getItem('directives-' + providerUri) || '{}');
}
, _set: function (providerUri, directives) {
providerUri = OAUTH3.utils.uri.normalize(providerUri);
providerUri = OAUTH3.uri.normalize(providerUri);
if (!OAUTH3.hooks.directives._cache) { OAUTH3.hooks.directives._cache = {}; }
OAUTH3.hooks.directives._cache[providerUri] = directives;
return OAUTH3.PromiseA.resolve(OAUTH3.hooks.directives.set(providerUri, directives));
@ -469,14 +469,18 @@
console.error(new Error('no providerUri').stack);
throw new Error("providerUri is not set");
}
providerUri = OAUTH3.utils.uri.normalize(providerUri);
providerUri = OAUTH3.uri.normalize(providerUri);
console.warn('[Warn] Please implement OAUTH3.hooks.session.set = function (providerUri, newSession) { return PromiseA<newSession>; }');
if (!OAUTH3.hooks.session._sessions) { OAUTH3.hooks.session._sessions = {}; }
OAUTH3.hooks.session._sessions[providerUri] = newSession;
return OAUTH3.PromiseA.resolve(newSession);
}
, _getCached: function (providerUri) {
providerUri = OAUTH3.uri.normalize(providerUri);
return OAUTH3.hooks.session._sessions[providerUri];
}
, get: function (providerUri) {
providerUri = OAUTH3.utils.uri.normalize(providerUri);
providerUri = OAUTH3.uri.normalize(providerUri);
if (!providerUri) {
throw new Error("providerUri is not set");
}
@ -496,7 +500,8 @@
return directives;
}
return OAUTH3._discoverHelper(providerUri, opts).then(function (directives) {
directives.issuer = directives.issuer || OAUTH3.utils.url.normalize(providerUri);
directives.azp = directives.azp || OAUTH3.url.normalize(providerUri);
directives.issuer = directives.issuer || OAUTH3.url.normalize(providerUri);
// OAUTH3.PromiseA.resolve() is taken care of because this is wrapped
return OAUTH3.hooks.directives._set(providerUri, directives);
});
@ -517,6 +522,8 @@
return OAUTH3._requestHelper(preq, opts);
}
OAUTH3.url.resolve(preq.providerUri || preq.provider_uri || preq.directives && preq.directives.issuer, preq.url);
if (!preq.session) {
return fetch();
}
@ -526,8 +533,9 @@
, _requestHelper: function (preq, opts) {
return OAUTH3._browser.request(preq, opts);
}
, implicitGrant: function(providerUri, opts) {
, implicitGrant: function(directives, opts) {
var promise;
var providerUri = directives.azp || directives.issuer || directives;
if (opts.broker) {
// Discovery can happen in-flow because we know that this is
@ -583,7 +591,7 @@
}
return OAUTH3._browser.frameRequest(
OAUTH3.utils.url.resolve(directives.issuer, authReq.url)
OAUTH3.url.resolve(directives.issuer, authReq.url)
, authReq.state // state should recycle params
, { windowType: opts.windowType
, reuseWindow: opts.broker && '-broker'
@ -592,7 +600,7 @@
).then(function (tokens) {
if (tokens.error) {
// TODO directives.audience
return OAUTH3.PromiseA.reject(OAUTH3.utils._formatError(directives.issuer /*providerUri*/, tokens));
return OAUTH3.PromiseA.reject(OAUTH3.error.parse(directives.issuer /*providerUri*/, tokens));
}
return tokens;
@ -606,7 +614,7 @@
var data = req.data;
data.provider_uri = providerUri;
if (data.error) {
return OAUTH3.PromiseA.reject(OAUTH3.utils._formatError(providerUri, data));
return OAUTH3.PromiseA.reject(OAUTH3.error.parse(providerUri, data));
}
return OAUTH3.hooks.session.refresh(opts, data);
});
@ -627,7 +635,7 @@
);
return OAUTH3._browser.frameRequest(
OAUTH3.utils.url.resolve(directives.issuer, logoutReq.url)
OAUTH3.url.resolve(directives.issuer, logoutReq.url)
, logoutReq.state // state should recycle params
, { windowType: 'popup'
, reuseWindow: opts.broker && '-broker'
@ -638,7 +646,7 @@
if (params.error) {
// TODO directives.audience
return OAUTH3.PromiseA.reject(OAUTH3.utils._formatError(directives.issuer /*providerUri*/, params));
return OAUTH3.PromiseA.reject(OAUTH3.error.parse(directives.issuer /*providerUri*/, params));
}
return params;
@ -654,7 +662,7 @@
// TODO we don't need to include this if we're using jQuery or angular
, discover: function(providerUri, opts) {
opts = opts || {};
providerUri = OAUTH3.utils.url.normalize(providerUri);
providerUri = OAUTH3.url.normalize(providerUri);
if (providerUri.match(OAUTH3._browser.window.location.hostname)) {
console.warn("It looks like you're a provider checking for your own directive,"
@ -662,7 +670,7 @@
+ " OAUTH3.request({ method: 'GET', url: '.well-known/oauth3/directive.json' })");
return OAUTH3.request({
method: 'GET'
, url: OAUTH3.utils.url.normalize(providerUri) + '/.well-known/oauth3/directives.json'
, url: OAUTH3.url.normalize(providerUri) + '/.well-known/oauth3/directives.json'
}).then(function (resp) {
return resp.data;
});
@ -695,7 +703,7 @@
opts._windowType = opts.windowType;
opts.windowType = opts.windowType || 'background';
return OAUTH3._browser.frameRequest(
OAUTH3.utils.url.resolve(providerUri, discReq.url)
OAUTH3.url.resolve(providerUri, discReq.url)
, discReq.state
// why not just pass opts whole?
, { windowType: opts.windowType
@ -708,7 +716,7 @@
// caller will call OAUTH3._browser.closeFrame(discReq.state, { debug: opts.debug || params.debug });
if (params.error) {
// TODO directives.issuer || directives.audience
return OAUTH3.PromiseA.reject(OAUTH3.utils._formatError(providerUri, params));
return OAUTH3.PromiseA.reject(OAUTH3.error.parse(providerUri, params));
}
// TODO params should have response_type indicating json, binary, etc
@ -842,7 +850,7 @@
}).then(function (params) {
if (params.error) {
// TODO directives.issuer || directives.audience
return OAUTH3.PromiseA.reject(OAUTH3.utils._formatError('https://oauth3.org', params));
return OAUTH3.PromiseA.reject(OAUTH3.error.parse('https://oauth3.org', params));
}
return params;
});