auto-refresh on request
This commit is contained in:
parent
0e7d7ecaea
commit
578e2b7354
104
oauth3.js
104
oauth3.js
|
@ -73,14 +73,95 @@
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
oauth3.provideRequest = function (request, opts) {
|
oauth3._recaseRequest = function (recase, req) {
|
||||||
|
// convert JavaScript camelCase to oauth3/ruby snake_case
|
||||||
|
if (req.data && 'object' === typeof req.data) {
|
||||||
|
req.originalData = req.data;
|
||||||
|
req.data = recase.snakeCopy(req.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return req;
|
||||||
|
};
|
||||||
|
oauth3._recaseResponse = function (recase, resp) {
|
||||||
|
// convert oauth3/ruby snake_case to JavaScript camelCase
|
||||||
|
if (resp.data && 'object' === typeof resp.data) {
|
||||||
|
resp.originalData = resp.data;
|
||||||
|
resp.data = recase.camelCopy(resp.data);
|
||||||
|
}
|
||||||
|
return resp;
|
||||||
|
};
|
||||||
|
oauth3._lintRequest = function (preq, opts) {
|
||||||
|
var providerUri;
|
||||||
|
var fresh;
|
||||||
|
|
||||||
|
console.log('[os] request meta opts', opts);
|
||||||
|
|
||||||
|
// check that the JWT is not expired
|
||||||
|
// TODO check that this request applies to the aud and azp
|
||||||
|
if (!(preq.session && preq.session.accessToken)) {
|
||||||
|
console.log('[os] no session/accessTokenData');
|
||||||
|
return oauth3.PromiseA.resolve(preq);
|
||||||
|
}
|
||||||
|
|
||||||
|
preq.headers = preq.headers || {};
|
||||||
|
preq.headers.Authorization = 'Bearer ' + preq.session.accessToken;
|
||||||
|
|
||||||
|
if (!preq.session._accessTokenData) {
|
||||||
|
console.log('[os] no _accessTokenData');
|
||||||
|
preq.session._accessTokenData = core.jwt.decode(preq.session.accessToken).payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!preq.url.match(preq.session._accessTokenData.aud)) {
|
||||||
|
console.log("[os] doesn't match audience", preq.session._accessTokenData.aud);
|
||||||
|
return oauth3.PromiseA.resolve(preq);
|
||||||
|
}
|
||||||
|
|
||||||
|
fresh = (Date.now() / 1000) >= (parseInt(preq.session._accessTokenData.exp) || 0);
|
||||||
|
if (!fresh) {
|
||||||
|
console.log("[os] isn't fresh", preq.session._accessTokenData.exp);
|
||||||
|
return oauth3.PromiseA.resolve(preq);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!preq.session.refreshToken) {
|
||||||
|
console.log("[os] cann't refresh", preq.session);
|
||||||
|
return oauth3.PromiseA.resolve(preq);
|
||||||
|
}
|
||||||
|
|
||||||
|
opts.refreshToken = preq.session.refreshToken;
|
||||||
|
console.log('[oauth3.js] refreshToken attempt');
|
||||||
|
|
||||||
|
// TODO include directive?
|
||||||
|
providerUri = preq.session.providerUri || preq.session._accessTokenData.iss;
|
||||||
|
//opts.
|
||||||
|
return oauth3.refreshToken(providerUri, opts).then(function (res) {
|
||||||
|
console.log('[oauth3.js] refreshToken result:', res);
|
||||||
|
|
||||||
|
if (!res.data.accessToken) {
|
||||||
|
return preq;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO fire session update event
|
||||||
|
res.data.providerUri = preq.session.providerUri;
|
||||||
|
preq.session = res.data;
|
||||||
|
preq.headers.Authorization = 'Bearer ' + preq.session.accessToken;
|
||||||
|
return preq;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
oauth3.provideRequest = function (rawRequest, opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
var Recase = exports.Recase || require('recase');
|
var Recase = exports.Recase || require('recase');
|
||||||
// TODO make insensitive to providing exceptions
|
// TODO make insensitive to providing exceptions
|
||||||
var recase = Recase.create({ exceptions: {} });
|
var recase = Recase.create({ exceptions: {} });
|
||||||
|
|
||||||
|
function lintAndRequest(preq) {
|
||||||
|
return oauth3._lintRequest(preq, opts).then(function (preq) {
|
||||||
|
return rawRequest(preq);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (opts.rawCase) {
|
if (opts.rawCase) {
|
||||||
oauth3.request = request;
|
oauth3.request = lintAndRequest;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,23 +171,12 @@
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
if (opts.rawCase) {
|
if (opts.rawCase) {
|
||||||
return request(req);
|
return lintAndRequest(req, opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert JavaScript camelCase to oauth3 snake_case
|
req = oauth3._recaseRequest(recase, req);
|
||||||
if (req.data && 'object' === typeof req.data) {
|
return lintAndRequest(req, opts).then(function (res) {
|
||||||
req.originalData = req.data;
|
return oauth3._recaseResponse(recase, res);
|
||||||
req.data = recase.snakeCopy(req.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
//console.log('[F] [oauth3 req.url]', req.url);
|
|
||||||
return request(req).then(function (resp) {
|
|
||||||
// convert oauth3 snake_case to JavaScript camelCase
|
|
||||||
if (resp.data && 'object' === typeof resp.data) {
|
|
||||||
resp.originalData = resp.data;
|
|
||||||
resp.data = recase.camelCopy(resp.data);
|
|
||||||
}
|
|
||||||
return resp;
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue