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 * Third party authentication support for the remoting web-app. | 7 * Third party authentication support for the remoting web-app. |
8 * | 8 * |
9 * When third party authentication is being used, the client must request both a | 9 * When third party authentication is being used, the client must request both a |
10 * token and a shared secret from a third-party server. The server can then | 10 * token and a shared secret from a third-party server. The server can then |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 /** | 81 /** |
82 * Parse the access token from the URL to which we were redirected. | 82 * Parse the access token from the URL to which we were redirected. |
83 * | 83 * |
84 * @param {string} responseUrl The URL to which we were redirected. | 84 * @param {string} responseUrl The URL to which we were redirected. |
85 * @private | 85 * @private |
86 */ | 86 */ |
87 remoting.ThirdPartyTokenFetcher.prototype.parseRedirectUrl_ = | 87 remoting.ThirdPartyTokenFetcher.prototype.parseRedirectUrl_ = |
88 function(responseUrl) { | 88 function(responseUrl) { |
89 var token = ''; | 89 var token = ''; |
90 var sharedSecret = ''; | 90 var sharedSecret = ''; |
91 if (responseUrl && | 91 |
92 responseUrl.search(this.redirectUri_ + '#') == 0) { | 92 if (responseUrl && responseUrl.search('#') >= 0) { |
93 var query = responseUrl.substring(this.redirectUri_.length + 1); | 93 var query = responseUrl.substring(responseUrl.search('#') + 1); |
94 var parts = query.split('&'); | 94 var parts = query.split('&'); |
95 /** @type {Object.<string>} */ | 95 /** @type {Object.<string>} */ |
96 var queryArgs = {}; | 96 var queryArgs = {}; |
97 for (var i = 0; i < parts.length; i++) { | 97 for (var i = 0; i < parts.length; i++) { |
98 var pair = parts[i].split('='); | 98 var pair = parts[i].split('='); |
99 queryArgs[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); | 99 queryArgs[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); |
100 } | 100 } |
101 | 101 |
102 // Check that 'state' contains the same XSRF token we sent in the request. | 102 // Check that 'state' contains the same XSRF token we sent in the request. |
103 var xsrfToken = queryArgs['state']; | 103 if ('state' in queryArgs && queryArgs['state'] == this.xsrfToken_ && |
104 if (xsrfToken == this.xsrfToken_ && | |
105 'code' in queryArgs && 'access_token' in queryArgs) { | 104 'code' in queryArgs && 'access_token' in queryArgs) { |
106 // Terminology note: | 105 // Terminology note: |
107 // In the OAuth code/token exchange semantics, 'code' refers to the value | 106 // In the OAuth code/token exchange semantics, 'code' refers to the value |
108 // obtained when the *user* authenticates itself, while 'access_token' is | 107 // obtained when the *user* authenticates itself, while 'access_token' is |
109 // the value obtained when the *application* authenticates itself to the | 108 // the value obtained when the *application* authenticates itself to the |
110 // server ("implicitly", by receiving it directly in the URL fragment, or | 109 // server ("implicitly", by receiving it directly in the URL fragment, or |
111 // explicitly, by sending the 'code' and a 'client_secret' to the server). | 110 // explicitly, by sending the 'code' and a 'client_secret' to the server). |
112 // Internally, the piece of data obtained when the user authenticates | 111 // Internally, the piece of data obtained when the user authenticates |
113 // itself is called the 'token', and the one obtained when the host | 112 // itself is called the 'token', and the one obtained when the host |
114 // authenticates itself (using the 'token' received from the client and | 113 // authenticates itself (using the 'token' received from the client and |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 * Fetch a token from a token server using the identity.launchWebAuthFlow API. | 161 * Fetch a token from a token server using the identity.launchWebAuthFlow API. |
163 * @private | 162 * @private |
164 */ | 163 */ |
165 remoting.ThirdPartyTokenFetcher.prototype.fetchTokenIdentityApi_ = function() { | 164 remoting.ThirdPartyTokenFetcher.prototype.fetchTokenIdentityApi_ = function() { |
166 var fullTokenUrl = this.getFullTokenUrl_(); | 165 var fullTokenUrl = this.getFullTokenUrl_(); |
167 // TODO(rmsousa): chrome.identity.launchWebAuthFlow is experimental. | 166 // TODO(rmsousa): chrome.identity.launchWebAuthFlow is experimental. |
168 chrome.experimental.identity.launchWebAuthFlow( | 167 chrome.experimental.identity.launchWebAuthFlow( |
169 {'url': fullTokenUrl, 'interactive': true}, | 168 {'url': fullTokenUrl, 'interactive': true}, |
170 this.parseRedirectUrl_.bind(this)); | 169 this.parseRedirectUrl_.bind(this)); |
171 }; | 170 }; |
OLD | NEW |