refactor: 彻底移除 apiSecret 认证方式,仅保留 Bearer + PSK

删除:
- HmacUtil: deriveApiKey/deriveApiSecret/verifyMediabotPsk
- HmacAuthInterceptor: apiSecret 验签/自动创建账户/readBody
- AccountService: generateApiCredentials/registerByInterceptor
- AccountDTO: apiKey 字段
- AuthController: register 返回 apiSecret
- AdminController: generateApiKey 端点
- Users.vue: API Key 列/生成密钥弹窗
- api/index.js: genApiKey

认证方式简化为两种:
  Bearer Token → Web 管理后台
  PSK 签名    → 外部集成客户端
This commit is contained in:
mediabot-pt
2026-06-29 16:56:00 +08:00
parent 5304449de6
commit 311ead0e89
10 changed files with 56 additions and 315 deletions

View File

@@ -159,29 +159,6 @@ public class AdminController {
return ApiResponse.success();
}
/**
* 生成/重置 API Key
*/
@PostMapping("/accounts/{accountId}/api-key")
public ApiResponse<Map<String, String>> generateApiKey(
@PathVariable Long accountId,
HttpServletRequest request) {
checkAdmin(request);
var account = accountMapper.selectById(accountId);
if (account == null) {
return ApiResponse.error(404, "Account not found");
}
String[] keys = accountService.generateApiCredentials(accountId);
Map<String, String> result = new java.util.LinkedHashMap<>();
result.put("apiKey", keys[0]);
result.put("apiSecret", keys[1]);
// secret 只在生成时返回一次,前端需要立即保存
log.info("API key generated for account: id={}", accountId);
return ApiResponse.success(result);
}
/**
* 绑定额外邮箱
*/

View File

@@ -36,8 +36,8 @@ public class AuthController {
}
/**
* 用户注册(自动生成 API Key)
* 携带 PSK 签名头 → 自动提权为 TRUSTED
* 用户注册(密码可选)
* 携带 PSK 头自动提权为 TRUSTED
*/
@PostMapping("/register")
public ApiResponse<Map<String, Object>> register(
@@ -45,24 +45,18 @@ public class AuthController {
HttpServletRequest httpRequest) {
Account account = accountService.register(request);
// PSK 签名验证通过 → 自动提权
if (verifyMediabotPsk(httpRequest, request.getEmail())) {
account.setTrustLevel(com.par.core.enums.TrustLevel.TRUSTED);
accountService.updateAccount(account);
log.info("Account auto-trusted via PSK: email={}", account.getEmail());
}
AccountDTO dto = accountService.toDTO(account);
Map<String, Object> result = new LinkedHashMap<>();
result.put("account", dto);
result.put("apiKey", account.getApiKey());
result.put("apiSecret", account.getApiSecret());
result.put("account", accountService.toDTO(account));
return ApiResponse.success(result);
}
/**
* 账户恢复(DB 重置后无需管理员介入)
* PSK 签名验证通过 → 返回/重建凭据
* PSK 签名恢复账户
*/
@PostMapping("/recover")
public ApiResponse<Map<String, Object>> recover(
@@ -79,44 +73,34 @@ public class AuthController {
return ApiResponse.error(403, "Invalid PSK signature");
}
// 查找或创建账户
Account account = accountService.findByAnyEmail(email);
if (account == null) {
// 自动创建 + 提权
RegisterRequest req = new RegisterRequest();
req.setEmail(email);
account = accountService.register(req);
}
// 确保是 TRUSTED
if (account.getTrustLevel().ordinal() < com.par.core.enums.TrustLevel.TRUSTED.ordinal()) {
account.setTrustLevel(com.par.core.enums.TrustLevel.TRUSTED);
accountService.updateAccount(account);
}
AccountDTO dto = accountService.toDTO(account);
Map<String, Object> result = new LinkedHashMap<>();
result.put("account", dto);
result.put("apiKey", account.getApiKey());
result.put("apiSecret", account.getApiSecret());
result.put("account", accountService.toDTO(account));
log.info("Account recovered via PSK: email={}", email);
return ApiResponse.success(result);
}
/**
* 用户登录,返回 Bearer token + api_key
* 用户登录,返回 Bearer token
*/
@PostMapping("/login")
public ApiResponse<AccountDTO> login(@Valid @RequestBody LoginRequest request) {
Account account = accountService.login(request);
AccountDTO dto = accountService.toDTO(account);
dto.setToken(hmacAuthInterceptor.generateToken(account.getEmail()));
dto.setApiKey(account.getApiKey());
return ApiResponse.success(dto);
}
/**
* 验证 X-Medibot-Timestamp + X-Medibot-Signature(通过 PskService)
*/
private boolean verifyMediabotPsk(HttpServletRequest request, String email) {
String ts = request.getHeader("X-Medibot-Timestamp");
String sig = request.getHeader("X-Medibot-Signature");