Allow use of token for talking to pub.dev (#3330)

* Allow use of token for talking to pub.dev
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index c927e07..99b5051 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -165,13 +165,17 @@
         // explicitly have to define mock servers as official server to test
         // publish command with oauth2 credentials.
         if (runningFromTest &&
-            Platform.environment.containsKey('PUB_HOSTED_URL') &&
-            Platform.environment['_PUB_TEST_AUTH_METHOD'] == 'oauth2')
-          Platform.environment['PUB_HOSTED_URL'],
+            Platform.environment.containsKey('_PUB_TEST_DEFAULT_HOSTED_URL'))
+          Platform.environment['_PUB_TEST_DEFAULT_HOSTED_URL'],
       };
 
-      if (officialPubServers.contains(server.toString())) {
-        // Using OAuth2 authentication client for the official pub servers
+      final isOfficalServer = officialPubServers.contains(server.toString());
+      if (isOfficalServer && !cache.tokenStore.hasCredential(server)) {
+        // Using OAuth2 authentication client for the official pub servers, when
+        // we don't have an explicit token from [TokenStore] to use instead.
+        //
+        // This allows us to use `dart pub token add` to inject a token for use
+        // with the official servers.
         await oauth2.withClient(cache, (client) {
           return _publishUsingClient(packageBytes, client);
         });
diff --git a/lib/src/source/hosted.dart b/lib/src/source/hosted.dart
index 2cfc52a..7d08a55 100644
--- a/lib/src/source/hosted.dart
+++ b/lib/src/source/hosted.dart
@@ -117,8 +117,15 @@
     // Clearly, a bit of investigation is necessary before we update this to
     // pub.dev, it might be attractive to do next time we change the server API.
     try {
+      var defaultHostedUrl = 'https://pub.dartlang.org';
+      // Allow the defaultHostedUrl to be overriden when running from tests
+      if (runningFromTest) {
+        defaultHostedUrl =
+            io.Platform.environment['_PUB_TEST_DEFAULT_HOSTED_URL'] ??
+                defaultHostedUrl;
+      }
       return _defaultUrl ??= validateAndNormalizeHostedUrl(
-        io.Platform.environment['PUB_HOSTED_URL'] ?? 'https://pub.dartlang.org',
+        io.Platform.environment['PUB_HOSTED_URL'] ?? defaultHostedUrl,
       );
     } on FormatException catch (e) {
       throw ConfigException(
diff --git a/test/lish/archives_and_uploads_a_package_test.dart b/test/lish/archives_and_uploads_a_package_test.dart
index 88e4862..b033e28 100644
--- a/test/lish/archives_and_uploads_a_package_test.dart
+++ b/test/lish/archives_and_uploads_a_package_test.dart
@@ -37,6 +37,31 @@
     await pub.shouldExit(exit_codes.SUCCESS);
   });
 
+  test('archives and uploads a package using token', () async {
+    await servePackages();
+    await d.tokensFile({
+      'version': 1,
+      'hosted': [
+        {'url': globalServer.url, 'token': 'access token'},
+      ]
+    }).create();
+    var pub = await startPublish(globalServer);
+
+    await confirmPublish(pub);
+    handleUploadForm(globalServer);
+    handleUpload(globalServer);
+
+    globalServer.expect('GET', '/create', (request) {
+      return shelf.Response.ok(jsonEncode({
+        'success': {'message': 'Package test_pkg 1.0.0 uploaded!'}
+      }));
+    });
+
+    expect(pub.stdout, emits(startsWith('Uploading...')));
+    expect(pub.stdout, emits('Package test_pkg 1.0.0 uploaded!'));
+    await pub.shouldExit(exit_codes.SUCCESS);
+  });
+
   test('publishes to hosted-url with path', () async {
     await servePackages();
     await d.tokensFile({
@@ -48,7 +73,7 @@
     var pub = await startPublish(
       globalServer,
       path: '/sub/folder',
-      authMethod: 'token',
+      overrideDefaultHostedServer: false,
       environment: {'TOKEN': 'access token'},
     );
 
diff --git a/test/test_pub.dart b/test/test_pub.dart
index 94e64fc..fcba6a6 100644
--- a/test/test_pub.dart
+++ b/test/test_pub.dart
@@ -371,15 +371,17 @@
 Future<PubProcess> startPublish(
   PackageServer server, {
   List<String>? args,
-  String authMethod = 'oauth2',
+  bool overrideDefaultHostedServer = true,
   Map<String, String>? environment,
   String path = '',
 }) async {
   var tokenEndpoint = Uri.parse(server.url).resolve('/token').toString();
   args = ['lish', ...?args];
   return await startPub(args: args, tokenEndpoint: tokenEndpoint, environment: {
-    'PUB_HOSTED_URL': server.url + path,
-    '_PUB_TEST_AUTH_METHOD': authMethod,
+    if (overrideDefaultHostedServer)
+      '_PUB_TEST_DEFAULT_HOSTED_URL': server.url + path
+    else
+      'PUB_HOSTED_URL': server.url + path,
     if (environment != null) ...environment,
   });
 }
diff --git a/test/token/token_authentication_test.dart b/test/token/token_authentication_test.dart
index c020ac0..350bca4 100644
--- a/test/token/token_authentication_test.dart
+++ b/test/token/token_authentication_test.dart
@@ -19,8 +19,11 @@
         {'url': globalServer.url, 'env': 'TOKEN'},
       ]
     }).create();
-    var pub = await startPublish(globalServer,
-        authMethod: 'token', environment: {'TOKEN': 'access token'});
+    var pub = await startPublish(
+      globalServer,
+      overrideDefaultHostedServer: false,
+      environment: {'TOKEN': 'access token'},
+    );
     await confirmPublish(pub);
 
     handleUploadForm(globalServer);
@@ -36,7 +39,10 @@
         {'url': globalServer.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(globalServer, authMethod: 'token');
+    var pub = await startPublish(
+      globalServer,
+      overrideDefaultHostedServer: false,
+    );
     await confirmPublish(pub);
 
     handleUploadForm(globalServer);
diff --git a/test/token/when_receives_401_removes_token_test.dart b/test/token/when_receives_401_removes_token_test.dart
index 86c0559..add619b 100644
--- a/test/token/when_receives_401_removes_token_test.dart
+++ b/test/token/when_receives_401_removes_token_test.dart
@@ -19,7 +19,7 @@
         {'url': server.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(server, authMethod: 'token');
+    var pub = await startPublish(server, overrideDefaultHostedServer: false);
     await confirmPublish(pub);
 
     server.expect('GET', '/api/packages/versions/new', (request) {
diff --git a/test/token/when_receives_403_persists_saved_token_test.dart b/test/token/when_receives_403_persists_saved_token_test.dart
index 45fc7a4..6db5538 100644
--- a/test/token/when_receives_403_persists_saved_token_test.dart
+++ b/test/token/when_receives_403_persists_saved_token_test.dart
@@ -19,7 +19,7 @@
         {'url': server.url, 'token': 'access token'},
       ]
     }).create();
-    var pub = await startPublish(server, authMethod: 'token');
+    var pub = await startPublish(server, overrideDefaultHostedServer: false);
     await confirmPublish(pub);
 
     server.expect('GET', '/api/packages/versions/new', (request) {