From 0d7979a72fbd758a8ef957517f12efd6dc660c58 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 7 Sep 2018 20:37:06 +0200 Subject: [PATCH] Add revoke token to (external) auth (#1639) * Add revoke token to external auth * Lint * Update to HAWS 3.1.1 * Fix constant --- package.json | 2 +- src/common/auth/external_auth.js | 24 +++++++++++++++++++++--- src/layouts/app/auth-mixin.js | 15 +++++++++++---- yarn.lock | 6 +++--- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 10d609fe50..ea44f47acf 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "es6-object-assign": "^1.1.0", "eslint-import-resolver-webpack": "^0.10.0", "fecha": "^2.3.3", - "home-assistant-js-websocket": "^3.0.0", + "home-assistant-js-websocket": "^3.1.1", "intl-messageformat": "^2.2.0", "js-yaml": "^3.12.0", "leaflet": "^1.3.1", diff --git a/src/common/auth/external_auth.js b/src/common/auth/external_auth.js index fbee3f2a95..dccd24ffd0 100644 --- a/src/common/auth/external_auth.js +++ b/src/common/auth/external_auth.js @@ -3,7 +3,8 @@ */ import { Auth } from 'home-assistant-js-websocket'; -const CALLBACK_METHOD = 'externalAuthSetToken'; +const CALLBACK_SET_TOKEN = 'externalAuthSetToken'; +const CALLBACK_REVOKE_TOKEN = 'externalAuthRevokeToken'; if (!window.externalApp && !window.webkit) { throw new Error('External auth requires either externalApp or webkit defined on Window object.'); @@ -22,12 +23,12 @@ export default class ExternalAuth extends Auth { } async refreshAccessToken() { - const responseProm = new Promise((resolve) => { window[CALLBACK_METHOD] = resolve; }); + const responseProm = new Promise((resolve) => { window[CALLBACK_SET_TOKEN] = resolve; }); // Allow promise to set resolve on window object. await 0; - const callbackPayload = { callback: CALLBACK_METHOD }; + const callbackPayload = { callback: CALLBACK_SET_TOKEN }; if (window.externalApp) { window.externalApp.getExternalAuth(callbackPayload); @@ -45,4 +46,21 @@ export default class ExternalAuth extends Auth { this.data.access_token = tokens.access_token; this.data.expires = (tokens.expires_in * 1000) + Date.now(); } + + async revoke() { + const responseProm = new Promise((resolve) => { window[CALLBACK_REVOKE_TOKEN] = resolve; }); + + // Allow promise to set resolve on window object. + await 0; + + const callbackPayload = { callback: CALLBACK_REVOKE_TOKEN }; + + if (window.externalApp) { + window.externalApp.revokeExternalAuth(callbackPayload); + } else { + window.webkit.messageHandlers.revokeExternalAuth.postMessage(callbackPayload); + } + + await responseProm; + } } diff --git a/src/layouts/app/auth-mixin.js b/src/layouts/app/auth-mixin.js index 89ebe3ed13..37767e1991 100644 --- a/src/layouts/app/auth-mixin.js +++ b/src/layouts/app/auth-mixin.js @@ -27,9 +27,16 @@ export default superClass => class extends superClass { }); } - _handleLogout() { - this.hass.connection.close(); - clearState(); - document.location.href = '/'; + async _handleLogout() { + try { + await this.hass.auth.revoke(); + this.hass.connection.close(); + clearState(); + document.location.href = '/'; + } catch (err) { + // eslint-disable-next-line + console.error(err); + alert('Log out failed'); + } } }; diff --git a/yarn.lock b/yarn.lock index 16ba2dac13..331ecf680b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6561,9 +6561,9 @@ hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" -home-assistant-js-websocket@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-3.0.0.tgz#498828a29827bdd1f3e99cf3b5e152694cededbf" +home-assistant-js-websocket@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-3.1.1.tgz#264f9efdafdff1053294b07bcaa5629e51a22b73" home-or-tmp@^2.0.0: version "2.0.0"