我们如何验证“npm login”成功并且令牌没有过期?

Rya*_*yan 6 npm npm-registry

我有一个脚本来验证用户是否通过 grep 登录到私有 npm 注册表(通过“npm login”):

//registry-sub-url:_authToken=
Run Code Online (Sandbox Code Playgroud)

... 在:

~/.npmrc
Run Code Online (Sandbox Code Playgroud)

但是,随着用户凭据过期(由于标准密码过期规则),这会随着时间的推移而失效。

更重要的是,我创建的帮助脚本无法区分成功/失败的npm login调用,因为脚本总是以0状态退出。

问:(1)我们如何验证是否npm login成功?(2) 如何识别npm token何时过期?

Vor*_*nin 10

在 GitHub Packages 的上下文中:如果您使用 登录npm login --registry=https://npm.pkg.github.com,则可以使用npm whoami --registry=https://npm.pkg.github.com(相同的注册表)来验证当前登录的用户。

$ npm login --registry=https://npm.pkg.github.com
Username: <your-user>
Password: <your-password-or-your-personal-access-token>
Email: (this IS public) <your@email.com>
Logged in as <your-user> on https://npm.pkg.github.com/.

$ npm whoami --registry=https://npm.pkg.github.com
<your-user>
Run Code Online (Sandbox Code Playgroud)

如果我只运行npm whoami我会收到问题中提到的错误。

  • 这并没有回答OP的问题。它仅告诉您存储了令牌,而不告诉您令牌是否已过期。 (2认同)

Jua*_*ado 7

您可能会使用npm whoami命令。

$> npm whoami
${username}
$>  npm logout
 npm whoami
npm ERR! code ENEEDAUTH
npm ERR! need auth This command requires you to be logged in.
npm ERR! need auth You need to authorize this machine using `npm adduser`

npm ERR! A complete log of this run can be found in:
npm ERR!     /xxxxx/.npm/_logs/2019-02-06T10_21_10_780Z-debug.logged
Run Code Online (Sandbox Code Playgroud)

  • 因此,不幸的是,这不会检查登录是否有效,只是会保留它。我还依稀记得它不能优雅地处理原始登录失败的情况,因此保留了用户名/密码而不是令牌。我必须回去进行实验才能确定。本文的其他读者可能会发现此命令相关,但我没有提及。 (6认同)

Rya*_*yan 1

我正在发布我想出的解决方法,但我希望有更好的解决方案。

我让 Jenkins 定期运行这个 bash 脚本来测试/验证我的npm login私有注册表:

#/bin/bash

# Suppress commands (Jenkins turns this on)
set +x

# Suppress color codes from NPM output (for proper grepping)
export TERM=dumb

# Stop on any error
set -e

NPM_USERNAME=...
NPM_PASSWORD=...
NPM_URL=...
NPM_EMAIL=...
WORKSPACE=... (in my case, set by Jenkins)

echo "========"
echo "Looking for previous failed login (cached credentials)..."
echo ""
# NOTE: A previous failed login can result in an ".npmrc" containing
# a username/password in lieu of an auth token. We look for this and
# remove it (logout) if it exists so that the cached credentials are
# not applied when we run "expect" to login
# (which would see different prompts from cached credentials).

# Chop off "http:"/"https:" prefix from URL
NPM_REPO_PREFIX=`sed -e 's~https\{0,1\}:\(.*\)~\1~' <<< "$NPM_URL"`

# NOTE: piping to /dev/null so the password isn't printed
set +e
grep -F "${NPM_REPO_PREFIX}:_password=" ~/.npmrc > /dev/null
GREP_EXIT="$?"
set -e

if [[ "$GREP_EXIT" == "0" ]]; then
    echo "========"
    echo "Logging out of repo..."
    echo ""


    npm logout --registry "$NPM_URL"
fi

echo "========"
echo "Logging into repo..."
echo ""

(/usr/bin/expect <<EOF
set timeout 10
spawn npm login --verbose --registry "$NPM_URL"
match_max 100000

expect "Username"
send "$NPM_USERNAME\r"

expect "Password"
send "$NPM_PASSWORD\r"

expect "Email"
send "$NPM_EMAIL\r"

expect {
   timeout      exit 1
   expect eof
}

EOF
) | tee "$WORKSPACE/npm-login.out"

echo "========"
echo "Verifying output of login..."
echo ""
# NOTE: If the login fails, the npm command still exits with status "0",
# so we read the verbose output to see that the http server confirms
# successful with "http 201".

set +e
grep "npm http 201" "$WORKSPACE/npm-login.out"
GREP_EXIT="$?"
set -e

if [[ "$GREP_EXIT" != "0" ]]; then
  >&2 echo "========"
  >&2 echo "ERROR: Failed to login to repo [$NPM_REPO]"
  exit 1
else
  echo "========"
  echo "SUCCESS: Logged into [$NPM_REPO]"
fi
Run Code Online (Sandbox Code Playgroud)