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

Side by Side Diff: remoting/webapp/me2mom/background.js

Issue 7046012: Basic OAuth2 support using the native app flow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more fixes Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var remoting = {}; 5 var remoting = {};
6 6
7 function setItem(key, value) { 7 function setItem(key, value) {
8 window.localStorage.setItem(key, value); 8 window.localStorage.setItem(key, value);
9 } 9 }
10 10
11 function getItem(key, defaultValue) { 11 function getItem(key, defaultValue) {
12 var result = window.localStorage.getItem(key); 12 var result = window.localStorage.getItem(key);
13 return (result != null) ? result : defaultValue; 13 return (result != null) ? result : defaultValue;
14 } 14 }
15 15
16 function removeItem(key) { 16 function removeItem(key) {
17 window.localStorage.removeItem(key); 17 window.localStorage.removeItem(key);
18 } 18 }
19 19
20 function clearAll() { 20 function clearAll() {
21 window.localStorage.clear(); 21 window.localStorage.clear();
22 } 22 }
23 23
Jamie 2011/05/19 21:01:04 Does this belong in this file? It doesn't seem to
awong 2011/05/19 21:33:06 Moved out.
24 var oauth = ChromeExOAuth.initBackgroundPage({ 24 // Declare an OAuth2 class to handle retrieval/storage of an OAuth2 token.
25 'request_url': 'https://www.google.com/accounts/OAuthGetRequestToken', 25 //
26 'authorize_url': 'https://www.google.com/accounts/OAuthAuthorizeToken', 26 // Ideally, this should impelment the OAuth2 PostMessage flow to avoid needing
Jamie 2011/05/19 21:01:04 Nit: implement.
awong 2011/05/19 21:33:06 Done.
27 'access_url': 'https://www.google.com/accounts/OAuthGetAccessToken', 27 // to copy and paste a code, but that does not support extension URL schemes
28 'consumer_key': 'anonymous', 28 // quite yet. Instead, we currently use the native app flow with an
29 'consumer_secret': 'anonymous', 29 // authorization code that the user must cut/paste.
30 'scope': 'https://www.googleapis.com/auth/chromoting', 30 function OAuth2() {
31 'app_name': 'Remoting WebApp' 31 this.OAUTH2_REFRESH_TOKEN_NAME = 'oauth2_refresh_token';
32 }); 32
33 this.client_id = encodeURIComponent(
34 '440925447803-m890isgsr23kdkcu2erd4mirnrjalf98.' +
35 'apps.googleusercontent.com');
36 this.client_secret = encodeURIComponent('TgKrL73H2kJe6Ir0ufp7bf6e');
37 this.scope = encodeURIComponent(
38 'https://www.googleapis.com/auth/chromoting ' +
39 'https://www.googleapis.com/auth/googletalk');
40 this.redirect_uri = encodeURIComponent('urn:ietf:wg:oauth:2.0:oob');
41 }
42
43 OAuth2.prototype.isAuthenticated = function() {
44 if(this.getRefreshToken()) {
45 return true;
46 }
47 return false;
48 }
49
50 OAuth2.prototype.getAccessToken = function() {
Jamie 2011/05/19 21:01:04 I would expect a get method to have a return state
awong 2011/05/19 21:33:06 Cut and paste error. This function is defined low
51 if (!this.isAuthenticated()) {
52 throw "Not Authenticated";
53 }
54 }
55
56 OAuth2.prototype.clear = function() {
57 removeItem(this.OAUTH2_REFRESH_TOKEN_NAME);
58 delete this.access_token;
59 delete this.access_token_expiration;
60 }
61
62 OAuth2.prototype.setRefreshToken = function(token) {
63 setItem(this.OAUTH2_REFRESH_TOKEN_NAME, token);
64 }
65
66 OAuth2.prototype.getRefreshToken = function(token) {
67 return getItem(this.OAUTH2_REFRESH_TOKEN_NAME);
68 }
69
70 OAuth2.prototype.setAccessToken = function(token, expiration) {
71 this.access_token = token;
72 this.access_token_expiration = expiration;
73 }
74
75 OAuth2.prototype.needsNewAccessToken = function() {
76 if (!this.isAuthenticated()) {
77 throw "Not Authenticated.";
78 }
79 if (!this.access_token) {
80 return true;
81 }
82 if (Date.now() > this.access_token_expiration) {
83 return true;
84 }
85 return false;
86 }
87
88 OAuth2.prototype.getAccessToken = function() {
89 if (this.needsNewAccessToken()) {
90 throw "Access Token expired.";
91 }
92 return this.access_token;
93 }
94
95 OAuth2.prototype.refreshAccessToken = function(on_done) {
96 if (!this.isAuthenticated()) {
97 throw "Not Authenticated.";
98 }
99 var xhr = new XMLHttpRequest();
100 var that = this;
Jamie 2011/05/19 21:01:04 :)
awong 2011/05/19 21:33:06 Heh...apparently "var that = this;" is a common ja
101 xhr.onreadystatechange = function() {
102 if (xhr.readyState != 4) {
103 return;
104 }
105 if (xhr.status == 200) {
106 tokens = JSON.parse(xhr.responseText);
107 that.setAccessToken(tokens['access_token'],
108 tokens['expires_in'] * 1000 + Date.now());
109 } else {
110 console.log("Refresh access token failed. Status: " + xhr.status +
111 " response: " + xhr.responseText);
112 }
113 on_done();
114 };
115 xhr.open('POST', 'https://accounts.google.com/o/oauth2/token', true);
116 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
117 var post_data = 'client_id=' + this.client_id
118 + '&client_secret=' + this.client_secret
119 + '&refresh_token=' + encodeURIComponent(this.getRefreshToken())
120 + '&grant_type=refresh_token';
121 xhr.send(post_data);
122 }
123
124 OAuth2.prototype.openOAuth2Window = function() {
125 var GET_CODE_URL = 'https://accounts.google.com/o/oauth2/auth?'
126 + 'client_id=' + this.client_id
127 + '&redirect_uri=' + this.redirect_uri
128 + '&scope=' + this.scope
129 + '&response_type=code';
130 window.open(GET_CODE_URL);
131 }
132
133 OAuth2.prototype.exchangeCodeForToken = function(code, on_done) {
134 var xhr = new XMLHttpRequest();
135 var that = this;
136 xhr.onreadystatechange = function() {
137 if (xhr.readyState != 4) {
138 return;
139 }
140 if (xhr.status == 200) {
141 tokens = JSON.parse(xhr.responseText);
142 that.setRefreshToken(tokens['refresh_token']);
143 that.setAccessToken(tokens['access_token'],
144 tokens['expires_in'] + Date.now());
145 } else {
146 console.log("Code exchnage failed. Status: " + xhr.status +
147 " response: " + xhr.responseText);
148 }
149 on_done();
150 };
151 xhr.open('POST', 'https://accounts.google.com/o/oauth2/token', true);
152 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
153 var post_data = 'client_id=' + this.client_id
154 + '&client_secret=' + this.client_secret
155 + '&redirect_uri=' + this.redirect_uri
156 + '&code=' + encodeURIComponent(code)
157 + '&grant_type=authorization_code';
158 xhr.send(post_data);
159 }
160
161 var oauth2 = new OAuth2();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698