---
id: ERR-20260502-002
title: AIxC UAT/Prod 的 itadmin 密码不是 Admin@2024（部署后被改过）
date: 2026-05-02
tags: [aixc, deploy, credentials, ops]
---

## 现象

按 `init-itadmin.ts:15` 的 `defaultPassword = 'Admin@2024'` 直接登录 AIxC UAT 和 Prod，全部返回 401 Invalid credentials。

## 根因

部署脚本 `scripts/deploy/deploy.sh:1421` 在 2026-04-07 首次部署时调用 `npm run init:itadmin`，初始密码确实是 `Admin@2024`。但 DB 里 `platform_iam.users.updated_at = 2026-04-07 09:21`（UAT/Prod 同分钟），说明部署完成后**人工修改过密码**（可能是部署人 `hongwei.zhang` 通过 UI 改密或直接 SQL UPDATE），未在文档里留下记录。

## 关键差异点

- AIxC 登录接口的请求字段是 `username`，不是 `email`（FFAI 也是 username，但 FFAI 部分老接口接 email 参数；做接口测试时容易混）
- AIxC 后端**没有 forgot/reset password 公开接口**（grep `backend/src/modules/auth` 无 `resetPassword` / `forgotPassword`）
- 所以密码丢失只能：(1) 找最初设密码的人；(2) 直接 SQL UPDATE password_hash

## 检测方法

不要假设 init 脚本里的默认密码就是当前密码。验证：

```bash
# 在服务器上直接打 backend
ssh itadminaixc@<host> 'curl -s -X POST http://localhost:<backend_port>/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d "{\"username\":\"itadmin\",\"password\":\"Admin@2024\"}"'
# 看返回 200/401
```

DB 端只能看 `updated_at` 是否晚于 `created_at`——如果晚很多，密码很可能被改过；如果一致或仅差几分钟，可能只是 role 关联触发的 update（不动 password_hash）。**这两种情况无法仅通过 SQL 区分**，必须实测登录。

## 重置密码标准流程（UAT）

```bash
# 1) 本地生成 hash
cd backend && node -e "console.log(require('bcrypt').hashSync('NewPassword@2026', 10))"

# 2) 远程 UPDATE（UAT 可直接做，Prod 需用户明确授权）
ssh itadminaixc@<host> "docker exec aixc-uat-postgres psql -U aixc_uat -d aixc_uat \
  -c \"UPDATE platform_iam.users SET password_hash='<hash>', updated_at=NOW() WHERE username='itadmin';\""
```

## 适用范围

任何"部署完一段时间后想登 AIxC 管理员账号"的场景；也提醒所有项目：**init 脚本里的默认密码 ≠ 现行密码**，凡是 deploy 后 1+ 周的环境都要假设密码已改。
