这些天开源了一个自己平常使用的uni-app路由框架(详见用了都说好的 uniapp 路由框架),在发布 npm 包的时候遇到了一些问题,去年写过一篇文章使用npm发布自己的第一个包,当时发布包开启 2fa 验证后通过指纹验证就可以了,但是在发布 caring-route 的包时发现旧有的方式失效了,使用 npm login 时会产生这个提示,然后需要输入用户名、密码,邮箱,2fa 验证码,颇为麻烦:
vbnet
npm notice Security Notice: Classic tokens have been revoked. Granular tokens are now limited to 90 days and require 2FA by default. Update your CI/CD workflows to avoid disruption. Learn more https://gh.io/all-npm-classic-tokens-revoked
结合在 npm 官网看到的置顶提示:

这才知道,npm 官方在 2026 年强制更新了安全政策,具体来说就是:
- 旧的「经典令牌 (Classic tokens)」被 npm 官方全部作废回收:即之前本地保存的、用于指纹 / 免密登录的令牌,现在彻底不能用了;
- npm 强制启用「细粒度令牌 (Granular tokens)」 :这是新版的安全令牌,有效期默认只有 90 天,到期就要重新生成;
- 安全门槛提升 :npm 要求所有发布包的账号,必须开启 两步验证 (2FA) ,且细粒度令牌默认强制绑定 2FA,没有例外;
- 登录方式变更 :npm 不再支持「指纹授权 / 一键免密登录」这种简单方式,即现在的
npm login必须要使用新版令牌,否则强制输入账号密码才能登录。
那么,问题来了,npm 的细粒度令牌 (Granular tokens)是什么? 为什么这个令牌要叫「细粒度」,和之前的「经典令牌」差在哪?下面听我娓娓道来。
细粒度令牌 (Granular tokens)
所谓「细粒度」=【权限可以精细化控制】,这是它的核心特征,是对比 被作废的「经典令牌 (Classic Token)」 来的,两者是完全不同的两种令牌。下面是他们之间的区别:
旧版:经典令牌 (Classic Token) ------ 之前指纹登录用的令牌
- 权限:一刀切的「超级管理员权限」 → 拿到这个令牌,能做 npm 账号的「所有操作」:发布包、删包、改账号信息、看所有私密包... 权限无限大;
- 有效期:永久有效,生成一次能用一辈子,npm 不主动作废就一直能用;
- 安全要求:无任何要求,不用开 2FA,谁都能生成;
- 为什么被作废:权限太大 + 永久有效,一旦泄露,账号等于彻底被盗,npm 生态被恶意包搞的乌烟瘴气,所以 npm全网强制回收所有经典令牌。
新版:细粒度令牌 (Granular Access Token) ------ npm 最新推出的
- 权限:可以「按需勾选、精细化分配」 → 这就是「细粒度」的核心含义。你想要什么权限,就只勾选什么权限,多一分权限都不给。
- 有效期:强制 90 天,npm 新规要求,最长只能 90 天,到期自动失效;
- 安全要求:npm「默认要求」开 2FA,但不是强制。
- 为什么是它:权限小 + 有效期短,就算令牌泄露,风险也极小,90 天后自动作废,安全风险可控。
那么在了解了细粒度令牌后, 我们应该怎么用其新规来发布包呢?很明显,如果不使用令牌,采用传统的默认的 npm login 发包流程很反人类:要输用户名、密码、输邮箱,还要输 2FA 一次性验证码,发布个包要折腾半天,对高频发布的开发者来说简直是折磨。
好在 npm 提供了 「本地配置永久授权令牌」 的机制,可以做到永久免登录发布,直接 npm 令牌写入本地的 npm 全局配置文件里,npm 会永久读取这个令牌作为身份凭证,完全跳过 npm login 整个流程 ,不需要登录、不需要输用户名、不需要输邮箱、不需要输验证码,以后发布包,只需要在项目里敲 npm publish 一个命令,直接发布成功!
并且这个配置是永久生效的,哪怕 90 天后令牌过期了,也只是重新换个令牌再执行一次配置命令就行,比反复登录舒服 100 倍。下面就是操作流程:
npm 免登录发布
步骤 1:生成细粒度令牌 (Granular Access Token)
- 打开 npm 官网 → 账号 → Access tokens →Generate New Token

- 依次输入名称,勾选
Bypass two-factor authentication (2FA)(不勾选的话每次发包还需要再输入 2fa 验证码),选择包范围和过期时间(最多 90 天)
生成后的细粒度令牌复制下来,然后进入终端
步骤 2:Mac 终端执行【一行核心命令】,永久配置令牌
直接复制下面的命令到终端,把 你的细粒度令牌 替换成你复制的令牌字符串,直接回车执行,没有任何反馈就是配置成功
arduino
npm config set //registry.npmjs.org/:_authToken=你的细粒度令牌
步骤 3:检查配置是否生效
方式一:终端执行下面的命令,能看到你的令牌就说明配置成功了
arduino
npm config get //registry.npmjs.org/:_authToken
npm ERR! ---sekretz---
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/wanko/.npm/_logs/2026-01-12T07_44_13_678Z-debug.log
方式二:直接执行 npm whoami 命令
bash
npm whoami
成功的结果:
终端会直接输出你的 npm 官网账号名 说明:npm 已经通过你配置的令牌,成功识别了你的身份,令牌配置完全生效!
从此以后的发布流程
不管是 90 天内,还是换了项目,只要还是这台电脑,发布 npm 包全程只有 2 步,无任何输入:
-
终端进入你的 npm 包项目目录
-
执行发布命令即可:bash运行
npm publish
效果:回车后直接打包、上传、发布成功,没有任何弹窗、没有任何输入项,秒发,爽到飞起
补充说明
90 天后令牌过期了怎么办?
令牌有效期 90 天,过期后执行 npm whoami 会提示身份失效,解决方法超级简单:
- 去 npm 官网 → 账号 → Access tokens → 生成一个新的「Automation」令牌,复制;
- Mac 终端执行之前的配置命令,用新令牌替换旧令牌:
arduino
npm config set //registry.npmjs.org/:_authToken=你的新令牌
- 执行
npm whoami验证,搞定!
不用删旧令牌、不用 logout、不用改配置文件,直接覆盖就行,npm 会自动用新令牌生效。
关于细粒度令牌在本地的保存
- 令牌只保存在电脑的本地配置文件
~/.npmrc里,不会上传到任何服务器,不会被 npm / 任何人获取; - 令牌是「自动化令牌」,权限仅用于「登录 + 发布包」,没有账号修改、删除等高危权限,就算泄露(概率极低),别人最多只能用你的账号发布包,改不了你的账号信息;
- npm 的
---sekretz---机制,就是为了防止你在公共场合执行命令时,令牌被别人看到,是双重保护。
总结
虽然 npm 更新了安全策略,但总得来说新的令牌可以让发布更友好,比之前指纹授权的体验还要好,毕竟指纹授权登录还得跳转网页再回到终端,需要等待网页的加载,还有切换操作,而现在通过细粒度令牌,可以直接免登录,且一行命令就能实现发包,以后发布包再也不用折腾那些繁琐的步骤了,真的是 too easy too happy。