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

Unified Diff: remoting/webapp/oauth2.js

Issue 10704240: Cleaned up OAuth refresh error handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed JSCompiler errors. Created 8 years, 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/webapp/oauth2.js
diff --git a/remoting/webapp/oauth2.js b/remoting/webapp/oauth2.js
index ece2619959398c7e9ce323a97687d89377fc8c4b..50bc38b6effd4ad6afb61babd2c60fc98d138cea 100644
--- a/remoting/webapp/oauth2.js
+++ b/remoting/webapp/oauth2.js
@@ -62,7 +62,7 @@ remoting.OAuth2.prototype.isAuthenticated = function() {
*/
remoting.OAuth2.prototype.clear = function() {
window.localStorage.removeItem(this.KEY_EMAIL_);
- this.clearAccessToken();
+ this.clearAccessToken_();
this.clearRefreshToken_();
};
@@ -78,7 +78,7 @@ remoting.OAuth2.prototype.clear = function() {
remoting.OAuth2.prototype.setRefreshToken = function(token) {
window.localStorage.setItem(this.KEY_REFRESH_TOKEN_, escape(token));
window.localStorage.setItem(this.KEY_REFRESH_TOKEN_REVOKABLE_, true);
- this.clearAccessToken();
+ this.clearAccessToken_();
};
/**
@@ -163,8 +163,9 @@ remoting.OAuth2.prototype.getAccessTokenInternal_ = function() {
* Will throw if !isAuthenticated().
*
* @return {boolean} True if a new access token is needed.
+ * @private
*/
-remoting.OAuth2.prototype.needsNewAccessToken = function() {
+remoting.OAuth2.prototype.needsNewAccessToken_ = function() {
if (!this.isAuthenticated()) {
throw 'Not Authenticated.';
}
@@ -179,22 +180,10 @@ remoting.OAuth2.prototype.needsNewAccessToken = function() {
};
/**
- * Returns the current access token.
- *
- * Will throw if !isAuthenticated() or needsNewAccessToken().
- *
- * @return {string} The access token.
+ * @return {void} Nothing.
* @private
*/
-remoting.OAuth2.prototype.getAccessToken_ = function() {
- if (this.needsNewAccessToken()) {
- throw 'Access Token expired.';
- }
- return this.getAccessTokenInternal_()['token'];
-};
-
-/** @return {void} Nothing. */
-remoting.OAuth2.prototype.clearAccessToken = function() {
+remoting.OAuth2.prototype.clearAccessToken_ = function() {
window.localStorage.removeItem(this.KEY_ACCESS_TOKEN_);
};
@@ -202,12 +191,14 @@ remoting.OAuth2.prototype.clearAccessToken = function() {
* Update state based on token response from the OAuth2 /token endpoint.
*
* @private
- * @param {function(XMLHttpRequest): void} onDone Callback to invoke on
+ * @param {function(XMLHttpRequest, string): void} onDone Callback to invoke on
* completion.
* @param {XMLHttpRequest} xhr The XHR object for this request.
* @return {void} Nothing.
*/
remoting.OAuth2.prototype.processTokenResponse_ = function(onDone, xhr) {
+ /** @type {string} */
+ var accessToken = '';
if (xhr.status == 200) {
try {
// Don't use jsonParseSafe here unless you move the definition out of
@@ -225,7 +216,8 @@ remoting.OAuth2.prototype.processTokenResponse_ = function(onDone, xhr) {
// The choice of 2 minutes is arbitrary, but that length of time
// is part of the contract satisfied by callWithToken().
// Offset by a further 30 seconds to account for RTT issues.
- this.setAccessToken(tokens['access_token'],
+ accessToken = /** @type {string} */ (tokens['access_token']);
+ this.setAccessToken(accessToken,
(tokens['expires_in'] - (120 + 30)) * 1000 + Date.now());
} catch (err) {
console.error('Invalid "token" response from server:',
@@ -235,7 +227,7 @@ remoting.OAuth2.prototype.processTokenResponse_ = function(onDone, xhr) {
console.error('Failed to get tokens. Status: ' + xhr.status +
' response: ' + xhr.responseText);
}
- onDone(xhr);
+ onDone(xhr, accessToken);
};
/**
@@ -330,11 +322,7 @@ remoting.OAuth2.prototype.revokeToken_ = function(token) {
};
/**
- * Call myfunc with an access token as the only parameter.
- *
- * This will refresh the access token if necessary. If the access token
- * cannot be refreshed, an error is thrown.
- *
+ * Call a function with an access token, refreshing it first if necessary.
* The access token will remain valid for at least 2 minutes.
*
* @param {function(string):void} onOk Function to invoke with access token if
@@ -344,13 +332,13 @@ remoting.OAuth2.prototype.revokeToken_ = function(token) {
* @return {void} Nothing.
*/
remoting.OAuth2.prototype.callWithToken = function(onOk, onError) {
- try {
- if (this.needsNewAccessToken()) {
+ if (this.isAuthenticated()) {
+ if (this.needsNewAccessToken_()) {
this.refreshAccessToken_(this.onRefreshToken_.bind(this, onOk, onError));
} else {
- onOk(this.getAccessToken_());
+ onOk(this.getAccessTokenInternal_()['token']);
}
- } catch (error) {
+ } else {
onError(remoting.Error.NOT_AUTHENTICATED);
}
};
@@ -363,12 +351,14 @@ remoting.OAuth2.prototype.callWithToken = function(onOk, onError) {
* @param {function(remoting.Error):void} onError Function to invoke with an
* error code on failure.
* @param {XMLHttpRequest} xhr The result of the refresh operation.
+ * @param {string} accessToken The fresh access token.
* @private
*/
-remoting.OAuth2.prototype.onRefreshToken_ = function(onOk, onError, xhr) {
+remoting.OAuth2.prototype.onRefreshToken_ = function(onOk, onError, xhr,
+ accessToken) {
var error = remoting.Error.UNEXPECTED;
if (xhr.status == 200) {
- onOk(this.getAccessToken_());
+ onOk(accessToken);
return;
} else if (xhr.status == 400) {
var result =
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698