OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 /** | 5 /** |
6 * @fileoverview | 6 * @fileoverview |
7 * OAuth2 API flow implementations. | 7 * OAuth2 API flow implementations. |
8 */ | 8 */ |
9 | 9 |
10 'use strict'; | 10 'use strict'; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
66 * the access token and expiration time are successfully fetched. | 66 * the access token and expiration time are successfully fetched. |
67 * @param {function(!remoting.Error):void} onError Callback invoked if an | 67 * @param {function(!remoting.Error):void} onError Callback invoked if an |
68 * error occurs. | 68 * error occurs. |
69 * @param {string} clientId OAuth2 client ID. | 69 * @param {string} clientId OAuth2 client ID. |
70 * @param {string} clientSecret OAuth2 client secret. | 70 * @param {string} clientSecret OAuth2 client secret. |
71 * @param {string} refreshToken OAuth2 refresh token to be redeemed. | 71 * @param {string} refreshToken OAuth2 refresh token to be redeemed. |
72 * @return {void} Nothing. | 72 * @return {void} Nothing. |
73 */ | 73 */ |
74 remoting.OAuth2ApiImpl.prototype.refreshAccessToken = function( | 74 remoting.OAuth2ApiImpl.prototype.refreshAccessToken = function( |
75 onDone, onError, clientId, clientSecret, refreshToken) { | 75 onDone, onError, clientId, clientSecret, refreshToken) { |
76 /** @param {XMLHttpRequest} xhr */ | 76 /** @param {remoting.Xhr.Response} xhrr */ |
77 var onResponse = function(xhr) { | 77 var onResponse = function(xhrr) { |
78 if (xhr.status == 200) { | 78 if (xhrr.status == 200) { |
79 try { | 79 try { |
80 // Don't use base.jsonParseSafe here unless you also include base.js, | 80 // Don't use base.jsonParseSafe here unless you also include base.js, |
81 // otherwise this won't work from the OAuth trampoline. | 81 // otherwise this won't work from the OAuth trampoline. |
82 // TODO(jamiewalch): Fix this once we're no longer using the trampoline. | 82 // TODO(jamiewalch): Fix this once we're no longer using the trampoline. |
83 var tokens = JSON.parse(xhr.responseText); | 83 var tokens = JSON.parse(xhrr.responseText); |
84 onDone(tokens['access_token'], tokens['expires_in']); | 84 onDone(tokens['access_token'], tokens['expires_in']); |
85 } catch (/** @type {Error} */ err) { | 85 } catch (/** @type {Error} */ err) { |
86 console.error('Invalid "token" response from server:', err); | 86 console.error('Invalid "token" response from server:', err); |
87 onError(remoting.Error.UNEXPECTED); | 87 onError(remoting.Error.UNEXPECTED); |
88 } | 88 } |
89 } else { | 89 } else { |
90 console.error('Failed to refresh token. Status: ' + xhr.status + | 90 console.error('Failed to refresh token. Status: ' + xhrr.status + |
91 ' response: ' + xhr.responseText); | 91 ' response: ' + xhrr.responseText); |
92 onError(remoting.Error.fromHttpStatus(xhr.status)); | 92 onError(remoting.Error.fromHttpStatus(xhrr.status)); |
93 } | 93 } |
94 }; | 94 }; |
95 | 95 |
96 remoting.xhr.start({ | 96 new remoting.Xhr({ |
97 method: 'POST', | 97 method: 'POST', |
98 url: this.getOAuth2TokenEndpoint_(), | 98 url: this.getOAuth2TokenEndpoint_(), |
99 onDone: onResponse, | |
100 formContent: { | 99 formContent: { |
101 'client_id': clientId, | 100 'client_id': clientId, |
102 'client_secret': clientSecret, | 101 'client_secret': clientSecret, |
103 'refresh_token': refreshToken, | 102 'refresh_token': refreshToken, |
104 'grant_type': 'refresh_token' | 103 'grant_type': 'refresh_token' |
105 } | 104 } |
106 }); | 105 }).then(onResponse); |
107 }; | 106 }; |
108 | 107 |
109 /** | 108 /** |
110 * Asynchronously exchanges an authorization code for access and refresh tokens. | 109 * Asynchronously exchanges an authorization code for access and refresh tokens. |
111 * | 110 * |
112 * @param {function(string, string, number): void} onDone Callback to | 111 * @param {function(string, string, number): void} onDone Callback to |
113 * invoke when the refresh token, access token and access token expiration | 112 * invoke when the refresh token, access token and access token expiration |
114 * time are successfully fetched. | 113 * time are successfully fetched. |
115 * @param {function(!remoting.Error):void} onError Callback invoked if an | 114 * @param {function(!remoting.Error):void} onError Callback invoked if an |
116 * error occurs. | 115 * error occurs. |
117 * @param {string} clientId OAuth2 client ID. | 116 * @param {string} clientId OAuth2 client ID. |
118 * @param {string} clientSecret OAuth2 client secret. | 117 * @param {string} clientSecret OAuth2 client secret. |
119 * @param {string} code OAuth2 authorization code. | 118 * @param {string} code OAuth2 authorization code. |
120 * @param {string} redirectUri Redirect URI used to obtain this code. | 119 * @param {string} redirectUri Redirect URI used to obtain this code. |
121 * @return {void} Nothing. | 120 * @return {void} Nothing. |
122 */ | 121 */ |
123 remoting.OAuth2ApiImpl.prototype.exchangeCodeForTokens = function( | 122 remoting.OAuth2ApiImpl.prototype.exchangeCodeForTokens = function( |
124 onDone, onError, clientId, clientSecret, code, redirectUri) { | 123 onDone, onError, clientId, clientSecret, code, redirectUri) { |
125 /** @param {XMLHttpRequest} xhr */ | 124 /** @param {remoting.Xhr.Response} xhrr */ |
126 var onResponse = function(xhr) { | 125 var onResponse = function(xhrr) { |
127 if (xhr.status == 200) { | 126 if (xhrr.status == 200) { |
128 try { | 127 try { |
129 // Don't use base.jsonParseSafe here unless you also include base.js, | 128 // Don't use base.jsonParseSafe here unless you also include base.js, |
130 // otherwise this won't work from the OAuth trampoline. | 129 // otherwise this won't work from the OAuth trampoline. |
131 // TODO(jamiewalch): Fix this once we're no longer using the trampoline. | 130 // TODO(jamiewalch): Fix this once we're no longer using the trampoline. |
132 var tokens = JSON.parse(xhr.responseText); | 131 var tokens = JSON.parse(xhrr.responseText); |
133 onDone(tokens['refresh_token'], | 132 onDone(tokens['refresh_token'], |
134 tokens['access_token'], tokens['expires_in']); | 133 tokens['access_token'], tokens['expires_in']); |
135 } catch (/** @type {Error} */ err) { | 134 } catch (/** @type {Error} */ err) { |
136 console.error('Invalid "token" response from server:', err); | 135 console.error('Invalid "token" response from server:', err); |
137 onError(remoting.Error.UNEXPECTED); | 136 onError(remoting.Error.UNEXPECTED); |
138 } | 137 } |
139 } else { | 138 } else { |
140 console.error('Failed to exchange code for token. Status: ' + xhr.status + | 139 console.error('Failed to exchange code for token. Status: ' + |
141 ' response: ' + xhr.responseText); | 140 xhrr.status + ' response: ' + xhrr.responseText); |
142 onError(remoting.Error.fromHttpStatus(xhr.status)); | 141 onError(remoting.Error.fromHttpStatus(xhrr.status)); |
143 } | 142 } |
144 }; | 143 }; |
145 | 144 |
146 remoting.xhr.start({ | 145 new remoting.Xhr({ |
147 method: 'POST', | 146 method: 'POST', |
148 url: this.getOAuth2TokenEndpoint_(), | 147 url: this.getOAuth2TokenEndpoint_(), |
149 onDone: onResponse, | |
150 formContent: { | 148 formContent: { |
151 'client_id': clientId, | 149 'client_id': clientId, |
152 'client_secret': clientSecret, | 150 'client_secret': clientSecret, |
153 'redirect_uri': redirectUri, | 151 'redirect_uri': redirectUri, |
154 'code': code, | 152 'code': code, |
155 'grant_type': 'authorization_code' | 153 'grant_type': 'authorization_code' |
156 } | 154 } |
157 }); | 155 }).then(onResponse); |
158 }; | 156 }; |
159 | 157 |
160 /** | 158 /** |
161 * Get the user's email address. | 159 * Get the user's email address. |
162 * | 160 * |
163 * @param {function(string):void} onDone Callback invoked when the email | 161 * @param {function(string):void} onDone Callback invoked when the email |
164 * address is available. | 162 * address is available. |
165 * @param {function(!remoting.Error):void} onError Callback invoked if an | 163 * @param {function(!remoting.Error):void} onError Callback invoked if an |
166 * error occurs. | 164 * error occurs. |
167 * @param {string} token Access token. | 165 * @param {string} token Access token. |
168 * @return {void} Nothing. | 166 * @return {void} Nothing. |
169 */ | 167 */ |
170 remoting.OAuth2ApiImpl.prototype.getEmail = function(onDone, onError, token) { | 168 remoting.OAuth2ApiImpl.prototype.getEmail = function(onDone, onError, token) { |
171 /** @param {XMLHttpRequest} xhr */ | 169 /** @param {remoting.Xhr.Response} xhrr */ |
172 var onResponse = function(xhr) { | 170 var onResponse = function(xhrr) { |
173 if (xhr.status == 200) { | 171 if (xhrr.status == 200) { |
174 try { | 172 try { |
175 var result = JSON.parse(xhr.responseText); | 173 var result = JSON.parse(xhrr.responseText); |
176 onDone(result['email']); | 174 onDone(result['email']); |
177 } catch (/** @type {Error} */ err) { | 175 } catch (/** @type {Error} */ err) { |
178 console.error('Invalid "userinfo" response from server:', err); | 176 console.error('Invalid "userinfo" response from server:', err); |
179 onError(remoting.Error.UNEXPECTED); | 177 onError(remoting.Error.UNEXPECTED); |
180 } | 178 } |
181 } else { | 179 } else { |
182 console.error('Failed to get email. Status: ' + xhr.status + | 180 console.error('Failed to get email. Status: ' + xhrr.status + |
183 ' response: ' + xhr.responseText); | 181 ' response: ' + xhrr.responseText); |
184 onError(remoting.Error.fromHttpStatus(xhr.status)); | 182 onError(remoting.Error.fromHttpStatus(xhrr.status)); |
185 } | 183 } |
186 }; | 184 }; |
187 remoting.xhr.start({ | 185 new remoting.Xhr({ |
188 method: 'GET', | 186 method: 'GET', |
189 url: this.getOAuth2ApiUserInfoEndpoint_(), | 187 url: this.getOAuth2ApiUserInfoEndpoint_(), |
190 onDone: onResponse, | |
191 oauthToken: token | 188 oauthToken: token |
192 }); | 189 }).then(onResponse); |
193 }; | 190 }; |
194 | 191 |
195 /** | 192 /** |
196 * Get the user's email address and full name. | 193 * Get the user's email address and full name. |
197 * | 194 * |
198 * @param {function(string, string):void} onDone Callback invoked when the email | 195 * @param {function(string, string):void} onDone Callback invoked when the email |
199 * address and full name are available. | 196 * address and full name are available. |
200 * @param {function(!remoting.Error):void} onError Callback invoked if an | 197 * @param {function(!remoting.Error):void} onError Callback invoked if an |
201 * error occurs. | 198 * error occurs. |
202 * @param {string} token Access token. | 199 * @param {string} token Access token. |
203 * @return {void} Nothing. | 200 * @return {void} Nothing. |
204 */ | 201 */ |
205 remoting.OAuth2ApiImpl.prototype.getUserInfo = | 202 remoting.OAuth2ApiImpl.prototype.getUserInfo = |
206 function(onDone, onError, token) { | 203 function(onDone, onError, token) { |
207 /** @param {XMLHttpRequest} xhr */ | 204 /** @param {remoting.Xhr.Response} xhrr */ |
208 var onResponse = function(xhr) { | 205 var onResponse = function(xhrr) { |
209 if (xhr.status == 200) { | 206 if (xhrr.status == 200) { |
210 try { | 207 try { |
211 var result = JSON.parse(xhr.responseText); | 208 var result = JSON.parse(xhrr.responseText); |
212 onDone(result['email'], result['name']); | 209 onDone(result['email'], result['name']); |
213 } catch (/** @type {Error} */ err) { | 210 } catch (/** @type {Error} */ err) { |
214 console.error('Invalid "userinfo" response from server:', err); | 211 console.error('Invalid "userinfo" response from server:', err); |
215 onError(remoting.Error.UNEXPECTED); | 212 onError(remoting.Error.UNEXPECTED); |
216 } | 213 } |
217 } else { | 214 } else { |
218 console.error('Failed to get user info. Status: ' + xhr.status + | 215 console.error('Failed to get user info. Status: ' + xhrr.status + |
219 ' response: ' + xhr.responseText); | 216 ' response: ' + xhrr.responseText); |
220 onError(remoting.Error.fromHttpStatus(xhr.status)); | 217 onError(remoting.Error.fromHttpStatus(xhrr.status)); |
221 } | 218 } |
222 }; | 219 }; |
223 remoting.xhr.start({ | 220 new remoting.Xhr({ |
224 method: 'GET', | 221 method: 'GET', |
225 url: this.getOAuth2ApiUserInfoEndpoint_(), | 222 url: this.getOAuth2ApiUserInfoEndpoint_(), |
226 onDone: onResponse, | |
227 oauthToken: token | 223 oauthToken: token |
228 }); | 224 }).then(onResponse); |
229 }; | 225 }; |
230 | 226 |
231 /** @type {remoting.OAuth2Api} */ | 227 /** @type {remoting.OAuth2Api} */ |
232 remoting.oauth2Api = new remoting.OAuth2ApiImpl(); | 228 remoting.oauth2Api = new remoting.OAuth2ApiImpl(); |
OLD | NEW |