diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php
index 8019e194c..5c05a218b 100644
--- a/src/Composer/Repository/Vcs/GitHubDriver.php
+++ b/src/Composer/Repository/Vcs/GitHubDriver.php
@@ -325,7 +325,27 @@ class GitHubDriver extends VcsDriver
return $this->attemptCloneFallback();
}
- $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'Your GitHub credentials are required to fetch private repository metadata ('.$this->url.')');
+ $scopes_issued = array();
+ $scopes_needed = array();
+ if (!is_null($headers = $e->getHeaders())) {
+ // Check if X-OAuth-Scopes and X-Accepted-OAuth-Scopes should let us in...
+ foreach ($headers as $header) {
+ $k = substr($header, 0, strpos($header, ":"));
+ $v = trim(substr($header, strpos($header, ":")+1));
+ switch ($k) {
+ case 'X-OAuth-Scopes':
+ $scopes_issued = explode(" ", $v);
+ break;
+ case 'X-Accepted-OAuth-Scopes':
+ $scopes_needed = explode(" ", $v);
+ break;
+ }
+ }
+ }
+ $scopes_failed = array_diff($scopes_needed, $scopes_issued);
+ if (is_null($headers) || count($scopes_failed)) {
+ $gitHubUtil->authorizeOAuthInteractively($this->originUrl, 'Your GitHub credentials are required to fetch private repository metadata ('.$this->url.')');
+ }
return parent::getContents($url);