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

Unified Diff: chrome/browser/resources/google_now/background.js

Issue 17412009: Identification via OAuth tokens (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 6 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 | chrome/browser/resources/google_now/manifest.json » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/google_now/background.js
diff --git a/chrome/browser/resources/google_now/background.js b/chrome/browser/resources/google_now/background.js
index bd76627d1029d5fd2c25aded3fa196ca0794b301..c8299f247b0f6aa1d717b6afe9fe92a71df852d9 100644
--- a/chrome/browser/resources/google_now/background.js
+++ b/chrome/browser/resources/google_now/background.js
@@ -32,6 +32,8 @@
*/
var HTTP_OK = 200;
+var HTTP_FORBIDDEN = 403;
+
/**
* Initial period for polling for Google Now Notifications cards to use when the
* period from the server is not available.
@@ -98,6 +100,8 @@ function areTasksConflicting(newTaskName, scheduledTaskName) {
var tasks = buildTaskManager(areTasksConflicting);
// Add error processing to API calls.
+tasks.instrumentApiFunction(chrome.identity, 'getAuthToken', 1);
+tasks.instrumentApiFunction(chrome.identity, 'removeCachedAuthToken', 1);
tasks.instrumentApiFunction(chrome.location.onLocationUpdate, 'addListener', 0);
tasks.instrumentApiFunction(chrome.notifications, 'create', 2);
tasks.instrumentApiFunction(chrome.notifications, 'update', 2);
@@ -155,6 +159,45 @@ function recordEvent(event) {
}
/**
+ * Adds authorization behavior to the request.
+ * @param {XMLHttpRequest} request Server request.
+ * @param {function(boolean)} callbackBoolean Completion callback with 'success'
+ * parameter.
+ */
+function setAuthorization(request, callbackBoolean) {
+ tasks.debugSetStepName('setAuthorization-getAuthToken');
+ chrome.identity.getAuthToken({interactive: false}, function(token) {
+ var errorMessage =
+ chrome.runtime.lastError && chrome.runtime.lastError.message;
+ console.log('setAuthorization: error=' + errorMessage + ', token=' + token);
rgustafson 2013/06/19 00:56:51 Does adding the token onto this log really help? I
vadimt 2013/06/19 01:38:07 Done.
+ if (chrome.runtime.lastError || !token) {
+ callbackBoolean(false);
+ return;
+ }
+
+ request.setRequestHeader('Authorization', 'Bearer ' + token);
+
+ // Instrument onloadend to remove stale auth tokens.
+ var originalOnLoadEnd = request.onloadend;
+ request.onloadend = tasks.wrapCallback(function(event) {
+ if (request.status == HTTP_FORBIDDEN) {
rgustafson 2013/06/19 00:56:51 Could we also handle 401 unauthorized here? It wou
vadimt 2013/06/19 01:38:07 Done.
skare_ 2013/06/19 05:21:23 half-curiosity -- have you seen "forbidden" in pra
rgustafson 2013/06/19 18:39:10 The server should only be involved in the revoked
+ tasks.debugSetStepName('setAuthorization-removeCachedAuthToken');
+ chrome.identity.removeCachedAuthToken({token: token}, function() {
+ // After purging the token cache, call getAuthToken() again to let
+ // Chrome know about the problem with the token.
+ chrome.identity.getAuthToken({interactive: false}, function() {});
+ originalOnLoadEnd(event);
+ });
+ } else {
+ originalOnLoadEnd(event);
+ }
+ });
+
+ callbackBoolean(true);
+ });
+}
+
+/**
* Shows a notification and remembers information associated with it.
* @param {Object} card Google Now card represented as a set of parameters for
* showing a Chrome notification.
@@ -343,10 +386,9 @@ function requestNotificationCards(position, callback) {
',' + position.coords.longitude +
',' + position.coords.accuracy;
- // TODO(vadimt): Figure out how to send user's identity to the server.
var request = buildServerRequest('notifications');
- request.onloadend = tasks.wrapCallback(function(event) {
+ request.onloadend = function(event) {
console.log('requestNotificationCards-onloadend ' + request.status);
if (request.status == HTTP_OK) {
recordEvent(DiagnosticEvent.REQUEST_FOR_CARDS_SUCCESS);
@@ -354,10 +396,16 @@ function requestNotificationCards(position, callback) {
} else {
callback();
}
- });
+ };
- tasks.debugSetStepName('requestNotificationCards-send-request');
- request.send(requestParameters);
+ setAuthorization(request, function(success) {
+ if (success) {
+ tasks.debugSetStepName('requestNotificationCards-send-request');
+ request.send(requestParameters);
+ } else {
+ callback();
+ }
+ });
}
/**
@@ -411,16 +459,22 @@ function requestCardDismissal(
var requestParameters = 'id=' + notificationId +
'&dismissalAge=' + (Date.now() - dismissalTimeMs);
var request = buildServerRequest('dismiss');
- request.onloadend = tasks.wrapCallback(function(event) {
+ request.onloadend = function(event) {
console.log('requestDismissingCard-onloadend ' + request.status);
if (request.status == HTTP_OK)
recordEvent(DiagnosticEvent.DISMISS_REQUEST_SUCCESS);
callbackBoolean(request.status == HTTP_OK);
- });
+ };
- tasks.debugSetStepName('requestCardDismissal-send-request');
- request.send(requestParameters);
+ setAuthorization(request, function(success) {
+ if (success) {
+ tasks.debugSetStepName('requestCardDismissal-send-request');
+ request.send(requestParameters);
+ } else {
+ callbackBoolean(false);
+ }
+ });
}
/**
« no previous file with comments | « no previous file | chrome/browser/resources/google_now/manifest.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698