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

Side by Side Diff: utils/pub/oauth2.dart

Issue 12428012: Properly handle errors from the OAuth2 token endpoint in pub. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Minor changes Created 7 years, 9 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
« no previous file with comments | « utils/pub/http.dart ('k') | utils/tests/pub/oauth2_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library oauth2; 5 library oauth2;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:io'; 8 import 'dart:io';
9 import 'dart:uri'; 9 import 'dart:uri';
10 10
(...skipping 17 matching lines...) Expand all
28 /// secret. 28 /// secret.
29 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K'; 29 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K';
30 30
31 /// The URL to which the user will be directed to authorize the pub client to 31 /// The URL to which the user will be directed to authorize the pub client to
32 /// get an OAuth2 access token. 32 /// get an OAuth2 access token.
33 /// 33 ///
34 /// `access_type=offline` and `approval_prompt=force` ensures that we always get 34 /// `access_type=offline` and `approval_prompt=force` ensures that we always get
35 /// a refresh token from the server. See the [Google OAuth2 documentation][]. 35 /// a refresh token from the server. See the [Google OAuth2 documentation][].
36 /// 36 ///
37 /// [Google OAuth2 documentation]: https://developers.google.com/accounts/docs/O Auth2WebServer#offline 37 /// [Google OAuth2 documentation]: https://developers.google.com/accounts/docs/O Auth2WebServer#offline
38 final _authorizationEndpoint = Uri.parse( 38 final authorizationEndpoint = Uri.parse(
39 'https://accounts.google.com/o/oauth2/auth?access_type=offline' 39 'https://accounts.google.com/o/oauth2/auth?access_type=offline'
40 '&approval_prompt=force'); 40 '&approval_prompt=force');
41 41
42 /// The URL from which the pub client will request an access token once it's 42 /// The URL from which the pub client will request an access token once it's
43 /// been authorized by the user. 43 /// been authorized by the user. This can be controlled externally by setting
44 final _tokenEndpoint = Uri.parse( 44 /// the _PUB_TEST_TOKEN_ENDPOINT environment variable.
45 'https://accounts.google.com/o/oauth2/token'); 45 Uri get tokenEndpoint {
46 var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT'];
47 if (tokenEndpoint != null) {
48 return Uri.parse(tokenEndpoint);
49 } else {
50 return _tokenEndpoint;
51 }
52 }
53
54 final _tokenEndpoint = Uri.parse('https://accounts.google.com/o/oauth2/token');
46 55
47 /// The OAuth2 scopes that the pub client needs. Currently the client only needs 56 /// The OAuth2 scopes that the pub client needs. Currently the client only needs
48 /// the user's email so that the server can verify their identity. 57 /// the user's email so that the server can verify their identity.
49 final _scopes = ['https://www.googleapis.com/auth/userinfo.email']; 58 final _scopes = ['https://www.googleapis.com/auth/userinfo.email'];
50 59
51 /// An in-memory cache of the user's OAuth2 credentials. This should always be 60 /// An in-memory cache of the user's OAuth2 credentials. This should always be
52 /// the same as the credentials file stored in the system cache. 61 /// the same as the credentials file stored in the system cache.
53 Credentials _credentials; 62 Credentials _credentials;
54 63
55 /// Delete the cached credentials, if they exist. 64 /// Delete the cached credentials, if they exist.
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 writeTextFile(credentialsPath, credentials.toJson(), dontLogContents: true); 154 writeTextFile(credentialsPath, credentials.toJson(), dontLogContents: true);
146 } 155 }
147 156
148 /// The path to the file in which the user's OAuth2 credentials are stored. 157 /// The path to the file in which the user's OAuth2 credentials are stored.
149 String _credentialsFile(SystemCache cache) => 158 String _credentialsFile(SystemCache cache) =>
150 path.join(cache.rootDir, 'credentials.json'); 159 path.join(cache.rootDir, 'credentials.json');
151 160
152 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2. 161 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2.
153 /// Returns a Future that will complete to a fully-authorized [Client]. 162 /// Returns a Future that will complete to a fully-authorized [Client].
154 Future<Client> _authorize() { 163 Future<Client> _authorize() {
155 // Allow the tests to inject their own token endpoint URL.
156 var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT'];
157 if (tokenEndpoint != null) {
158 tokenEndpoint = Uri.parse(tokenEndpoint);
159 } else {
160 tokenEndpoint = _tokenEndpoint;
161 }
162
163 var grant = new AuthorizationCodeGrant( 164 var grant = new AuthorizationCodeGrant(
164 _identifier, 165 _identifier,
165 _secret, 166 _secret,
166 _authorizationEndpoint, 167 authorizationEndpoint,
167 tokenEndpoint, 168 tokenEndpoint,
168 httpClient: httpClient); 169 httpClient: httpClient);
169 170
170 // Spin up a one-shot HTTP server to receive the authorization code from the 171 // Spin up a one-shot HTTP server to receive the authorization code from the
171 // Google OAuth2 server via redirect. This server will close itself as soon as 172 // Google OAuth2 server via redirect. This server will close itself as soon as
172 // the code is received. 173 // the code is received.
173 return HttpServer.bind('127.0.0.1', 0).then((server) { 174 return HttpServer.bind('127.0.0.1', 0).then((server) {
174 var authUrl = grant.getAuthorizationUrl( 175 var authUrl = grant.getAuthorizationUrl(
175 Uri.parse('http://localhost:${server.port}'), scopes: _scopes); 176 Uri.parse('http://localhost:${server.port}'), scopes: _scopes);
176 177
(...skipping 21 matching lines...) Expand all
198 response.statusCode = 404; 199 response.statusCode = 404;
199 response.close(); 200 response.close();
200 } 201 }
201 }); 202 });
202 }) 203 })
203 .then((client) { 204 .then((client) {
204 log.message('Successfully authorized.\n'); 205 log.message('Successfully authorized.\n');
205 return client; 206 return client;
206 }); 207 });
207 } 208 }
OLDNEW
« no previous file with comments | « utils/pub/http.dart ('k') | utils/tests/pub/oauth2_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698