1551 字
8 分鐘

npm recovery code 登入後不能 publish?先查 72 小時安全暫停

用 npm recovery code 成功登入後,帳號可能不是「已恢復就立刻完全解鎖」。npm 在 2026 年 9 月 9 日公告,所有帳號在 recovery-code sign-in 後都會進入 72 小時安全暫停:登入、瀏覽與安裝仍可用,但 publish、建立 access token 和其他安全敏感的帳號寫入會暫停。

這個狀態最容易被誤判成 registry 故障或 CI token 壞掉。先確認登入方式和暫停開始時間,再把可做與不可做的操作分開;72 小時不能提前由使用者解除,重複使用另一組 recovery code 也不會延長或重設計時。

先把「登入成功」與「可以發佈」分開#

Recovery code 的作用是讓你重新取得帳號登入能力,不代表所有高風險寫入會立即恢復:

操作72 小時安全暫停期間
登入 npm、瀏覽 package、下載或安裝套件可以
修改 password、加入新的 2FA可以
publish 或 unpublish package不可以
建立、撤銷或管理 access token不可以
修改 package settings、maintainer、organization/team 或 billing不可以
修改既有 2FA 設定不可以

因此「npm install 正常」和「npm publish 被拒絕」可以同時成立。不要因為 registry 還能下載套件,就推論 publish credential 或 package policy 一定沒有問題。

72 小時計時從哪裡開始?#

計時起點是 成功使用 recovery code 登入,不是第一次 publish 失敗,也不是最後一次輸入錯誤密碼。實務上先記下成功登入的日期、時間、時區與帳號,並在 incident note 中標記預計解除時間。

有三個容易誤會的地方:

  • 另一組 recovery code 不會延長、重設或縮短這個安全暫停。
  • 使用者不能要求提前解除;系統會在 72 小時結束後自動恢復受限制的操作。
  • 每組 recovery code 只能使用一次;重新產生 recovery codes 會讓舊 codes 失效。

如果你懷疑有人未經授權使用 recovery code,不要把它當成一般等待問題,應直接聯絡 npm Support,說明登入時間與帳號狀況。

CI publish 失敗時先查這三層#

遇到 release workflow 失敗,先按順序排除:

  1. 登入事件:負責 publish 的 npm 帳號最近是否使用過 recovery code?如果是,先把 72 小時暫停列為主要假設。
  2. 操作類型:是 package install、npm view 等讀取操作失敗,還是 npm publish、建立 token 等安全敏感寫入失敗?兩者的排查方向不同。
  3. credential owner:CI 使用的 token 是否屬於同一個 npm 帳號,或 workflow 已改用 Trusted Publishing?不要看到 publish 失敗就盲目重建 token,因為安全暫停期間建立 token 本身也被禁止。

等待期間可以先確認 workflow 的 package、registry、權限與 release commit,並保存完整錯誤輸出;不要反覆重試 publish,避免把真正的 registry、權限或 package 設定問題和暫停狀態混在一起。

如果流程是 GitHub Actions 的 Trusted Publishing,仍要先確認 npm package 的 trusted publisher、OIDC 權限與 workflow 設定;安全暫停解決的是帳號風險狀態,不會替你修正另一條獨立的 OIDC 設定錯誤。長期 publish 認證的規劃可參考 npm Trusted Publishing 與 Bypass 2FA token 的遷移方式

恢復期間可以先做哪些安全動作?#

官方文件列出的可用操作,適合用來完成復原準備:

  • 變更 password,確認新密碼沒有沿用其他服務的密碼。
  • 新增一組新的 2FA 方法,確保之後不必再次依賴 recovery code。
  • 檢查本機與 CI 的登入流程,但不要嘗試建立新 access token。
  • 整理 package、maintainer、organization/team 變更,等暫停結束後再執行。

這段時間不要把「不能修改既有 2FA」誤解成 recovery code 壞掉;它是安全暫停明確限制的一部分。若帳號本來就疑似遭到入侵,也不要等倒數結束才求助,直接走 npm Support 的帳號復原管道。

72 小時後用受控流程驗證 publish#

暫停結束後,不要立刻把 production release 當成第一次測試。可以按下面順序恢復:

  1. 以正常的 2FA 登入 npm,確認帳號與 package scope。
  2. 在受控環境驗證讀取操作和目前的 credential owner。
  3. 先用測試 package 或團隊既有的 staging release 流程確認 publish 權限。
  4. 檢查版本、dist contents、provenance/release metadata 與 CI log。
  5. 確認成功後再恢復正式 release,並把 incident note 的暫停原因與處置結果關閉。

如果帳號沒有使用 recovery code,卻仍然被錯誤地套用暫停或無法進行安全敏感操作,npm 文件建議聯絡 npm Support;不要用另一個 recovery code 反覆嘗試繞過狀態。

結論:先記錄恢復事件,再安排 release#

npm recovery code 是帳號復原的最後一道入口,但成功登入後的 72 小時安全暫停是刻意設計的風險邊界。把計時起點、可用操作、CI credential owner 和真正的 publish 流程分開記錄,團隊就能在等待期間完成準備,避免把安全保護誤判成 registry 或 token 故障。

常見問題#

Q: recovery code 登入後可以馬上 publish 嗎?#

A: 不行。官方文件說明成功使用 recovery code 登入後會有 72 小時安全暫停,期間 publish、unpublish 和多項安全敏感寫入會被阻止;登入、瀏覽與安裝仍可用。

Q: 再使用一組 recovery code,可以重新開始 72 小時嗎?#

A: 不會。另一組 recovery code 不會延長或重設暫停,而且每組 code 只能使用一次;重新產生 codes 也會使舊 codes 失效。

Q: 等待期間能不能建立新的 npm token?#

A: 不能。建立與管理 access token 屬於被暫停的安全敏感操作。先記錄 CI 的 credential owner 和預計變更,等暫停自動結束後再處理。

Q: 沒有用 recovery code,卻遇到同樣限制怎麼辦?#

A: 先保存帳號、時間、操作和完整錯誤訊息,並聯絡 npm Support。不要假設再登入一次或重建 token 就能解除狀態。

參考資料:

GitHub Changelog:npm extends recovery-code security holds to all accounts

npm Docs:Recovering your 2FA-enabled account

npm Docs:Trusted publishing for npm packages

npm recovery code 登入後不能 publish?先查 72 小時安全暫停
https://laplusda.com/posts/npm-recovery-code-72-hour-security-hold/
作者
Zero
發佈於
2026-09-13
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。