diff --git a/API.md b/API.md index 0162350..326b9e3 100644 --- a/API.md +++ b/API.md @@ -57,7 +57,7 @@ Admin、Component、Dict 与 MinIO 业务接口统一走 `JwtAuthGuard`。请求 ### WordPress 认证透传 -WordPress 侧只使用客户端登录态,后端不走 BasicAuth。当前 WordPress 只有单管理员账号且不开放注册,管理员账号配置放在 env 中,`/wordpress/auth/login` 会在 Admin 登录成功后使用该账号自动登录 WordPress,把 WordPress cookie 保存到本系统 httpOnly cookie,再把 REST nonce 和用户信息返回给前端持久化。 +WordPress 侧只使用客户端登录态,后端不走 BasicAuth。当前 WordPress 只有单管理员账号且不开放注册,管理员账号配置放在 env 中,Admin 调用 `/auth/login` 通过后,后端会在同一个登录流程里自动登录 WordPress,把 WordPress cookie 保存到本系统 httpOnly cookie,再把 REST nonce 和用户信息随 Admin 登录结果返回给前端持久化。 环境变量: @@ -325,9 +325,9 @@ Query: | 方法 | 路径 | 说明 | | --- | --- | --- | -| POST | `/auth/login` | 登录,返回 `accessToken`,并写入 access token 与刷新 token cookie | +| POST | `/auth/login` | 登录,返回 `accessToken` 与 `wordpressAuth`,并写入 access token、刷新 token 和 WordPress 授权 cookie | | POST | `/auth/refresh` | 通过刷新 token cookie 刷新 accessToken,并更新 token cookie | -| POST | `/auth/logout` | 退出登录并清理 access token 与刷新 token cookie | +| POST | `/auth/logout` | 退出登录并清理 access token、刷新 token 与 WordPress 授权 cookie | | GET | `/auth/codes` | 获取当前用户权限码 | | GET | `/user/info` | 获取当前用户信息 | | GET | `/menu/all` | 获取当前用户可访问菜单 | @@ -362,11 +362,11 @@ Query: ## WordPress 接口 -所有 `/wordpress/*` 管理接口都需要本系统后台登录态和 WordPress 客户端登录态。Admin 登录通过后会自动调用 `/wordpress/auth/login` 建立 WordPress 授权态;后端只把 WordPress cookie 保存到本系统 httpOnly cookie,不把 cookie 明文放入前端持久化。 +所有 `/wordpress/*` 管理接口都需要本系统后台登录态和 WordPress 客户端登录态。Admin 前端只调用现有 `/auth/login`,后端在该登录接口内部自动建立 WordPress 授权态;后端只把 WordPress cookie 保存到本系统 httpOnly cookie,不把 cookie 明文放入前端持久化。 ### POST `/wordpress/auth/login` -使用 env 中的 `WORDPRESS_ADMIN_USERNAME` 和 `WORDPRESS_ADMIN_PASSWORD` 登录 WordPress,写入 `kt_wordpress_auth` httpOnly cookie,并返回前端需要持久化的 REST nonce 和 WordPress 当前用户信息。 +使用 env 中的 `WORDPRESS_ADMIN_USERNAME` 和 `WORDPRESS_ADMIN_PASSWORD` 登录 WordPress,写入 `kt_wordpress_auth` httpOnly cookie,并返回前端需要持久化的 REST nonce 和 WordPress 当前用户信息。该接口主要保留为后端内部能力和调试口子,正常 Admin 登录链路不由前端主动调用它,而是通过 `/auth/login` 自动触发。 响应 `data`: diff --git a/README.md b/README.md index d2dfe31..9c171b2 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ pnpm test:e2e # e2e 测试 - 如果旧版本曾写入 `admin_user.id=0`,先执行 `sql/fix-admin-user-zero-id.sql` 修复脏数据,再重启服务。 - Admin、Component、Dict 与 MinIO 业务接口统一走 `JwtAuthGuard`;登录、刷新 token、退出登录和部分示例状态测试接口通过 `@Public()` 放行。 - WordPress 管理接口同样先走本系统 `JwtAuthGuard`,再透传客户端 WordPress 登录态访问 WordPress REST API;当前 WordPress 只有单管理员账号且不开放注册,账号配置放在 env 中,但不作为 BasicAuth 发送。 -- Admin 登录成功后会调用 `/wordpress/auth/login` 自动登录 WordPress,后端把 WordPress cookie 写入本系统 httpOnly cookie,前端只持久化 REST nonce 和用户信息。 +- Admin 前端只调用现有 `/auth/login`;后端会在登录流程里自动登录 WordPress,把 WordPress cookie 写入本系统 httpOnly cookie,前端只持久化 REST nonce 和用户信息。 - WordPress 客户端登录态优先通过 `X-WordPress-Authorization` 透传,也支持 `X-WP-Nonce` 加 WordPress 登录 cookie 的 REST cookie 认证。 - 如果 WordPress 服务器未开启 rewrite 导致 `/wp-json/*` 返回 404,后端会自动回退到 `?rest_route=/...` 形式继续访问 REST API。 - `kt-template-admin` 登录会写入 access token 与刷新 token cookie,`kt-template-online-web` 和 `kt-template-online-playground` 可在回跳后通过刷新 token 重新持久化登录态。 diff --git a/src/admin/admin.module.ts b/src/admin/admin.module.ts index 7971b9f..c6ae621 100644 --- a/src/admin/admin.module.ts +++ b/src/admin/admin.module.ts @@ -23,6 +23,7 @@ import { AdminUser } from './user/admin-user.entity'; import { AdminUserService } from './user/admin-user.service'; import { ToolsService } from '@/common'; import { MinioClientModule } from '@/minio/minio.module'; +import { WordpressModule } from '@/wordpress/wordpress.module'; @Module({ imports: [ @@ -36,6 +37,7 @@ import { MinioClientModule } from '@/minio/minio.module'; AdminAuthGuardModule, DictModule, MinioClientModule, + WordpressModule, ], controllers: [ AdminAuthController, diff --git a/src/admin/auth/admin-auth.controller.ts b/src/admin/auth/admin-auth.controller.ts index cf373e6..1c86469 100644 --- a/src/admin/auth/admin-auth.controller.ts +++ b/src/admin/auth/admin-auth.controller.ts @@ -15,6 +15,7 @@ import { AdminUser } from '../user/admin-user.entity'; import { AdminUserService } from '../user/admin-user.service'; import { AdminAuthService } from './admin-auth.service'; import { JwtAuthGuard } from './jwt-auth.guard'; +import { WordpressService } from '@/wordpress/wordpress.service'; @ApiTags('admin-auth') @Controller() @@ -24,6 +25,7 @@ export class AdminAuthController { private readonly authService: AdminAuthService, private readonly menuService: AdminMenuService, private readonly userService: AdminUserService, + private readonly wordpressService: WordpressService, ) {} @Post('auth/login') @@ -36,11 +38,19 @@ export class AdminAuthController { body.username, body.password, ); + const wordpressLogin = + await this.wordpressService.loginWithConfiguredAdmin(); this.authService.setAccessTokenCookie(res, accessToken); this.authService.setRefreshTokenCookie(res, refreshToken); + this.wordpressService.setAuthCookie(res, wordpressLogin.cookie); + return vbenSuccess({ ...this.userService.serializeUser(user), accessToken, + wordpressAuth: { + ...wordpressLogin.auth, + user: wordpressLogin.user, + }, }); } @@ -62,6 +72,7 @@ export class AdminAuthController { logout(@Res({ passthrough: true }) res: Response) { this.authService.clearAccessTokenCookie(res); this.authService.clearRefreshTokenCookie(res); + this.wordpressService.clearAuthCookie(res); return vbenSuccess(''); } diff --git a/src/wordpress/wordpress.module.ts b/src/wordpress/wordpress.module.ts index 39172a1..a640c76 100644 --- a/src/wordpress/wordpress.module.ts +++ b/src/wordpress/wordpress.module.ts @@ -16,5 +16,6 @@ import { WordpressTagController } from './wordpress-tag.controller'; WordpressCategoryController, ], providers: [ToolsService, WordpressService], + exports: [WordpressService], }) export class WordpressModule {}