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);