Hi, web react developers have no problem creating mapkit js token, our problem is that init mapkit js requires java developers to generate jwt, but cannot decrypt the map .P8 file


const path = require('path');
const express = require('express');
const jwt = require('jsonwebtoken');
const cors = require('cors');
const app = express();
// 配置 CORS - 允许前端域名
app.use(cors({
origin: ['http://localhost:5173', 'https://yourproductiondomain.com'],
credentials: true
}));
const TEAM_ID = '3K48PA624M'; // 你的 Team ID
const KEY_ID = 'MFF8WDFV2T'; // 你的 Key ID
const PRIVATE_KEY_PATH = path.join(__dirname, 'AuthKey_MFF8WDFV2T.p8');
// 读取私钥文件
let PRIVATE_KEY;
try {
PRIVATE_KEY = fs.readFileSync(PRIVATE_KEY_PATH, 'utf8');
console.log('私钥加载成功');
// 验证私钥格式
if (!PRIVATE_KEY.includes('-----BEGIN PRIVATE KEY-----') ||
!PRIVATE_KEY.includes('-----END PRIVATE KEY-----')) {
throw new Error('私钥格式不正确,必须包含 BEGIN/END PRIVATE KEY 标记');
}
} catch (error) {
console.error('无法读取私钥文件:', error.message);
process.exit(1);
}
function generateMapKitToken() {
const now = Math.floor(Date.now() / 1000);
const payload = {
iss: TEAM_ID, // Team ID
iat: now, // 签发时间
exp: now + 1800, // 30分钟有效(官方建议15-30分钟)
};
try {
// 使用 ES256 算法签名
const token = jwt.sign(payload, PRIVATE_KEY, {
algorithm: 'ES256',
header: {
alg: 'ES256',
typ: 'JWT',
kid: KEY_ID, // Key ID
}
});
console.log('JWT 生成成功');
return token;
} catch (error) {
console.error('JWT 生成错误:', error);
throw error;
}
}
// MapKit JS 令牌端点
app.get('/base-service/api/base/app/map/token', (req, res) => {
console.log('收到令牌请求,来源:', req.headers.origin || '未知');
try {
const token = generateMapKitToken();
// 返回纯文本令牌(MapKit JS 期望纯文本响应)
res.set('Content-Type', 'text/plain');
res.send(token);
} catch (err) {
console.error('令牌生成失败:', err);
res.status(500).json({
message: 'Token生成失败',
error: err.message
});
}
});
// 健康检查端点
app.get('/health', (req, res) => {
res.status(200).json({ status: 'OK', service: 'MapKit Token Service' });
});
// 启动服务器
const PORT = 7101;
app.listen(PORT, () => {
console.log(`MapKit Token Server running at http://localhost:${PORT}`);
console.log(`令牌端点: http://localhost:${PORT}/base-service/api/base/app/map/token`);
public async initializeMapKit(): Promise<void> {
if (this.isInitialized) return;
if (!(window as any).mapkit) throw new Error("MapKit 未加载");
return new Promise((resolve, reject) => {
(window as any).mapkit.init({
authorizationCallback:function(done) { // 注意这里不能 async
fetch("http://localhost:7101/base-service/api/base/app/map/token", {
method: "GET",
headers: {
"Content-Type": "application/json",
},
}).then(res => res.text())
.then(data => done(data))
.catch(error => console.error('获取令牌失败:', error));
},
language: "zh-CN",
});
(window as any).mapkit.addEventListener("configuration-change", (event) => {
console.log("map configuration change:", event);
switch (event.status) {
case "Initialized":
console.log("MapKit 已初始化");
break;
case "Refreshed":
console.log("MapKit 已刷新配置");
break;
}
});
});
}