Skip to content

Commit

Permalink
Check access token expires before we use it.If we found access token …
Browse files Browse the repository at this point in the history
…expires, we proactive call refresh token.So that we can avoid uncessary invalid auth error in backend.
  • Loading branch information
awarecan committed Jul 13, 2018
1 parent 89f9589 commit 420ece7
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 7 deletions.
9 changes: 8 additions & 1 deletion src/entrypoints/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -235,13 +235,20 @@ class HomeAssistant extends LocalizeMixin(PolymerElement) {
const host = window.location.protocol + '//' + window.location.host;
const auth = conn.options;
try {
if (auth.accessToken && Date.now() > auth.expires) {
// Refresh acess token if we know it expires
const accessToken = await window.refreshToken();
conn.options.accessToken = accessToken.access_token;
conn.options.expires = accessToken.expires;
}
return await hassCallApi(host, auth, method, path, parameters);
} catch (err) {
if (!err || err.status_code !== 401 || !auth.accessToken) throw err;

// If we connect with access token and get 401, refresh token and try again
const accessToken = await window.refreshToken();
conn.options.accessToken = accessToken;
conn.options.accessToken = accessToken.access_token;
conn.options.expires = accessToken.expires;
return await hassCallApi(host, auth, method, path, parameters);
}
},
Expand Down
32 changes: 26 additions & 6 deletions src/entrypoints/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ const init = window.createHassConnection = function (password, accessToken) {
if (password) {
options.authToken = password;
} else if (accessToken) {
options.accessToken = accessToken;
options.accessToken = accessToken.access_token;
options.expires = accessToken.expires;
}
return createConnection(url, options)
.then(function (conn) {
Expand All @@ -39,12 +40,19 @@ function redirectLogin() {
window.refreshToken = () =>
refreshToken_(clientId(), window.tokens.refresh_token).then((accessTokenResp) => {
window.tokens.access_token = accessTokenResp.access_token;
// shorten access token life 30 seconds to cover network cost
window.tokens.expires = ((accessTokenResp.expires_in - 30) * 1000) + Date.now();
localStorage.tokens = JSON.stringify(window.tokens);
return accessTokenResp.access_token;
return {
access_token: accessTokenResp.access_token,
expires: window.tokens.expires
};
}, () => redirectLogin());

function resolveCode(code) {
fetchToken(clientId(), code).then((tokens) => {
// shorten access token life 30 seconds to cover network cost
tokens.expires = ((tokens.expires_in - 30) * 1000) + Date.now();
localStorage.tokens = JSON.stringify(tokens);
// Refresh the page and have tokens in place.
document.location = location.pathname;
Expand All @@ -66,11 +74,23 @@ function main() {
}
if (localStorage.tokens) {
window.tokens = JSON.parse(localStorage.tokens);
window.hassConnection = init(null, window.tokens.access_token).catch((err) => {
if (err !== ERR_INVALID_AUTH) throw err;
if (window.tokens.expires === undefined) {
window.tokens.expires = Date.now() - 1;
}
if (Date.now() > window.tokens.expires) {
// refresh access token if we know it expires to reduce unncessary backend invalid auth event
window.hassConnection = window.refreshToken().then(accessToken => init(null, accessToken));
} else {
const accessTokenObject = {
access_token: window.tokens.access_token,
expires: window.tokens.expires
};
window.hassConnection = init(null, accessTokenObject).catch((err) => {
if (err !== ERR_INVALID_AUTH) throw err;

return window.refreshToken().then(accessToken => init(null, accessToken));
});
return window.refreshToken().then(accessToken => init(null, accessToken));
});
}
return;
}
redirectLogin();
Expand Down

0 comments on commit 420ece7

Please sign in to comment.