-
-
Notifications
You must be signed in to change notification settings - Fork 6.3k
Description
Version
4.5.10
Environment info
Environment Info:
System:
OS: Linux 5.10 Arch Linux
CPU: (4) x64 Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
Binaries:
Node: 15.5.1 - /usr/bin/node
Yarn: 1.22.10 - ~/.local/bin/yarn
npm: 6.14.11 - /usr/bin/npm
Browsers:
Chrome: Not Found
Firefox: 84.0.2
npmGlobalPackages:
@vue/cli: 4.5.10
Steps to reproduce
I am using the npm registry on an Azure DevOps server (formerly known as Microsoft TeamFoundation Server; TFS). To authenticate, it is neccesary to use basic authentication, which is not possible with vue-cli.
This becomes apparent when running vue ui
, vue create
or vue upgrade
in such an environment.
What is expected?
vue-cli should be able to access package information on the azure package feed
What is actually happening?
ERROR Failed to get response from https://myserver/tfs/mycollection/_packaging/packages/npm/registry/vue-cli-version-marker
As described in the npm registry docs, authentication with an npm registry is possible via basic auth, bearer auth and in both cases an optional OTP.
vue-cli only supports bearer auth without otp:
vue-cli/packages/@vue/cli/lib/util/ProjectPackageManager.js
Lines 279 to 312 in 027386e
async getMetadata (packageName, { full = false } = {}) { | |
const scope = extractPackageScope(packageName) | |
const registry = await this.getRegistry(scope) | |
const metadataKey = `${this.bin}-${registry}-${packageName}` | |
let metadata = metadataCache.get(metadataKey) | |
if (metadata) { | |
return metadata | |
} | |
const headers = {} | |
if (!full) { | |
headers.Accept = 'application/vnd.npm.install-v1+json;q=1.0, application/json;q=0.9, */*;q=0.8' | |
} | |
const authToken = await this.getAuthToken(scope) | |
if (authToken) { | |
headers.Authorization = `Bearer ${authToken}` | |
} | |
const url = `${registry.replace(/\/$/g, '')}/${packageName}` | |
try { | |
metadata = (await request.get(url, { headers })).body | |
if (metadata.error) { | |
throw new Error(metadata.error) | |
} | |
metadataCache.set(metadataKey, metadata) | |
return metadata | |
} catch (e) { | |
error(`Failed to get response from ${url}`) | |
throw e | |
} | |
} |
In contrast npm info vue-cli-version-marker --json
and yarn info vue-cli-version-marker --json
work fine, because they implement basic auth.
I wonder why we have to reimplement an npm registry client anyway.
Note: For basic auth the credentials are stored in .npmrc
as//registry-url:username=myusername
and //registry-url:_password=base64-encoded password
. So when sending the password with basic auth, we need to be careful not to double-encode.