Files
antiwear-web/server/index.js
ZF sun d43d732c03 feat: 添加华为云API网关SDK并重构认证逻辑
重构服务器端认证逻辑,使用华为云API网关SDK替代原有实现
新增自动获取授权码功能,当用户未输入时自动获取
添加SDK相关测试文件和许可证
2026-04-29 18:14:32 +08:00

93 lines
2.5 KiB
JavaScript

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const https = require('https');
const signer = require('./APIGW-javascript-sdk-2.0.6/signer');
const app = express();
const PORT = 3001;
app.use(cors());
app.use(express.json());
const METASTUDIO_API_BASE = 'https://metastudio.cn-north-4.myhuaweicloud.com';
async function createOnceCodeWithAKSK() {
const accessKey = process.env.HUAWEI_AK;
const secretKey = process.env.HUAWEI_SK;
const projectId = process.env.HUAWEI_PROJECT_ID;
if (!accessKey || !secretKey) {
throw new Error('请配置环境变量: HUAWEI_AK 和 HUAWEI_SK');
}
if (!projectId) {
throw new Error('请配置环境变量: HUAWEI_PROJECT_ID');
}
const uri = `/v1/${projectId}/digital-human-chat/once-code`;
const sig = new signer.Signer();
sig.Key = accessKey;
sig.Secret = secretKey;
const req = new signer.HttpRequest(
'POST',
`${METASTUDIO_API_BASE}${uri}`,
{
'content-type': 'application/json',
'x-project-id': projectId
},
'{}'
);
const options = sig.Sign(req);
return new Promise((resolve, reject) => {
const request = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
if (res.statusCode !== 200) {
reject(new Error(`API调用失败: ${res.statusCode} - ${data}`));
return;
}
const response = JSON.parse(data);
resolve(response.once_code);
});
});
request.on('error', (e) => {
reject(e);
});
request.write('{}');
request.end();
});
}
app.post('/api/once-code', async (req, res) => {
try {
console.log('使用 AK/SK 认证获取授权码...');
const onceCode = await createOnceCodeWithAKSK();
res.json({ once_code: onceCode });
} catch (error) {
console.error('获取授权码失败:', error);
res.status(500).json({
error_code: 'INTERNAL_ERROR',
error_msg: error.message
});
}
});
app.get('/health', (req, res) => {
res.json({ status: 'ok' });
});
app.listen(PORT, () => {
console.log(`后端服务已启动: http://localhost:${PORT}`);
console.log('使用 AK/SK 认证方式');
});