Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(535)

Unified Diff: remoting/webapp/crd/js/identity.js

Issue 868203002: Handle authentication failures in the v2 app by restarting the app (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address reviewer's feedback Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/webapp/crd/js/identity.js
diff --git a/remoting/webapp/crd/js/identity.js b/remoting/webapp/crd/js/identity.js
index aef0f2c6f984444844d7002e1f4d827a90dfb09b..ff695ec30055f96e79182c88c92ad82774ead43b 100644
--- a/remoting/webapp/crd/js/identity.js
+++ b/remoting/webapp/crd/js/identity.js
@@ -21,20 +21,17 @@ var remoting = remoting || {};
remoting.identity = null;
/**
- * @param {function(function():void):void} consentCallback Callback invoked if
- * user consent is required. The callback is passed a continuation function
- * which must be called from an interactive event handler (e.g. "click").
* @constructor
*/
-remoting.Identity = function(consentCallback) {
- /** @private */
- this.consentCallback_ = consentCallback;
+remoting.Identity = function() {
/** @type {string} @private */
this.email_ = '';
/** @type {string} @private */
this.fullName_ = '';
/** @type {Array.<remoting.Identity.Callbacks>} */
this.pendingCallbacks_ = [];
+ /** @type {Promise} */
+ this.handleAuthFailurePromise_ = null;
};
/**
@@ -75,27 +72,75 @@ remoting.Identity.prototype.callWithNewToken = function(onOk, onError) {
chrome.identity.removeCachedAuthToken(
{'token': token },
that.callWithToken.bind(that, onOk, onError));
- };
+ }
this.callWithToken(revokeToken, onError);
};
/**
+ * Removes the cached token and prompts the user to get a new one.
+ * @return {Promise} A promise that resolves when a new token is fetched.
+ */
+remoting.Identity.prototype.handleAuthFailure = function() {
+ if (!this.handleAuthFailurePromise_) {
+ var that = this;
+
+ var revokeToken = this.removeCachedAuthToken_();
+
+ // Revoke the token.
+ this.handleAuthFailurePromise_= revokeToken.then(function() {
+ // Showing the auth dialog is required as chrome.identity.getAuthToken
+ // must be initiated from user action when interactive is set to true.
+ return remoting.AuthDialog.show();
+ }).then(function(){
+ // Fetch the new token using the identity API.
+ return base.Promise.as(
+ chrome.identity.getAuthToken, [{ 'interactive': true }]);
+ }).then(
+ /** @param {string} token */
+ function(token) {
+ that.handleAuthFailurePromise_ = null;
+ if (token) {
+ return Promise.resolve(token);
+ }
+ return Promise.reject(remoting.Error.NOT_AUTHENTICATED);
+ }
+ );
+ }
+ return this.handleAuthFailurePromise_;
+};
+
+/**
+ * Removes the cached token, prompts the user to get a new one and
+ * relaunches the current window.
+ * @return {void} Nothing.
+ */
+remoting.Identity.prototype.handleAuthFailureAndRelaunch = function() {
+ this.handleAuthFailure().then(function() {
+ base.IPC.invoke(remoting.ActivationHandler.IPC.RELAUNCH,
kelvinp 2015/01/28 00:26:46 Will be fixed later after I address your feedback
+ chrome.app.window.current().id);
+ });
+};
+
+/**
* Remove the cached auth token, if any.
*
- * @param {function():void} onDone Completion callback.
- * @return {void} Nothing.
+ * @return {Promise} Promise that resolves when the cached token is removed.
+ * @private
*/
-remoting.Identity.prototype.removeCachedAuthToken = function(onDone) {
- /** @param {string} token */
- var onToken = function(token) {
- if (token) {
- chrome.identity.removeCachedAuthToken({ 'token': token }, onDone);
- } else {
- onDone();
- }
- };
- chrome.identity.getAuthToken({ 'interactive': false }, onToken);
+remoting.Identity.prototype.removeCachedAuthToken_ = function() {
+ var getToken =
+ base.Promise.as(chrome.identity.getAuthToken, [{'interactive': false}]);
+ return getToken.then(
+ /** @param {string} token */
+ function(token) {
+ if (token) {
+ return base.Promise.as(chrome.identity.removeCachedAuthToken,
+ [{'token': token}]);
+ } else {
+ return Promise.resolve();
+ }
+ });
};
/**
@@ -206,19 +251,8 @@ remoting.Identity.prototype.onAuthComplete_ = function(interactive, token) {
}
// If there's no token, but we haven't yet prompted for permission, do so
- // now. The consent callback is responsible for continuing the auth flow.
- this.consentCallback_(this.onAuthContinue_.bind(this));
-};
-
-/**
- * Called in response to the user signing in to the web-app.
- *
- * @private
- */
-remoting.Identity.prototype.onAuthContinue_ = function() {
- chrome.identity.getAuthToken(
- { 'interactive': true },
- this.onAuthComplete_.bind(this, true));
+ // now.
+ this.handleAuthFailure().then(this.onAuthComplete_.bind(this, true));
};
/**

Powered by Google App Engine
This is Rietveld 408576698