1. 7 海图GIS平台开发
Shipxy
  • 船讯网API服务概述
  • 注册与创建应用
  • 多语言SDK引入
  • AI大模型接入MCP服务
  • 视频监控AI识别预警服务
    • 视频监控服务接入指南
    • 视频监控API服务说明
    • 视频监控场景应用指南
    • 视频监控服务FAQ与最佳实践
  • AI智能体应用
    • 运力资源智能体
    • 船舶风控智能体
    • 运输规划智能体
    • 航次时效预测智能体
    • 船舶安全监控智能体
    • 多式联运协同智能体
    • 大宗贸易态势分析智能体
  • 1 船舶查询
    • 1.1 船舶位置查询
      • 1.1.1 单船位置查询
      • 1.1.2 多船位置查询
      • 1.1.3 船队位置查询
    • 1.2 船舶模糊查询
      GET
    • 1.3 周边船舶查询
      GET
    • 1.4 区域船舶查询
      GET
    • 1.5 船舶船籍查询
      GET
    • 1.6 船舶档案查询
      GET
  • 2 港口查询
    • 2.1 港口信息查询
    • 2.2 港口当前靠泊船查询
    • 2.3 港口当前到锚船查询
    • 2.4 港口预抵船舶查询
  • 3 历史行为
    • 3.1 船舶历史轨迹查询
    • 3.2 船舶互相搭靠记录查询
  • 4 挂靠记录
    • 4.1 船舶历史挂靠记录
    • 4.2 船舶挂靠指定港口记录
    • 4.3 船舶当前挂靠信息
    • 4.4 港口挂靠历史船舶
  • 5 航线规划
    • 5.1 点到点航线规划
    • 5.2 港到港航线规划
    • 5.3 预计到达时间(ETA)查询
  • 6 天气气象
    • 6.1 新全球气象
      • 6.1.1 实时气象数据
      • 6.1.2 未来气象预报
    • 6.2 全球台风
      • 6.2.1 获取全球台风列表
      • 6.2.2 获取单个台风信息
    • 6.3 国内港口潮汐
      • 6.3.1 查询国内潮汐观测站列表
      • 6.3.2 查询单个观测站潮汐详情
    • 6.4 全球港口潮汐
      • 6.4.1 查询全球潮汐观测站列表
      • 6.4.2 查询单个观测站潮汐详情
    • 6.5 海区气象
    • 6.6 单点海洋气象
    • 6.7 历史气象记录
  • 7 海图GIS平台开发
    • 7.1 快速入门:从注册到接入
    • 7.2 地图引擎基础:地图控制与业务绘制
    • 7.3 船位展示服务
    • 7.4 历史轨迹服务
    • 7.5 图层与气象服务
    • 7.6 航线绘制与区域回放服务
    • 7.7 Vue项目接入指南
    • 7.8 API Key安全实践:后端代理接入
  • 8 海事数据
    • 8.1 航行警告查询
  • 9 监控推送
    • 9.1 监控船队管理
      • 9.1.1 创建船队
      • 9.1.2 更新船队信息
      • 9.1.3 查询船队
      • 9.1.4 删除船队
      • 9.1.5 船队船舶增加
      • 9.1.6 船队船舶批量更新
      • 9.1.7 船队船舶删除
    • 9.2 区域监控推送
      • 9.2.1 区域创建
      • 9.2.2 区域更新
      • 9.2.3 区域查询
      • 9.2.4 区域删除
      • 9.2.5 区域监控推送内容
    • 9.3 船舶航速提醒推送
      • 9.3.1 新增船舶订阅
      • 9.3.2 删除订阅船舶信息
      • 9.3.3 查询订阅船舶列表
      • 9.3.4 船舶航速异常推送
    • 9.4 实时船位推送
    • 9.5 船舶到离港事件推送
    • 9.6 船舶动态ETA推送
    • 9.7 船舶AIS信号消失事件推送
    • 9.8 船舶搭靠事件推送
  • 文档附录
    • 船舶类型对照表
    • 服务码返回说明
    • 海区对照表
    • 航行状态对照表
    • 绕航节点清单
    • 航标类型对照表
  1. 7 海图GIS平台开发

7.8 API Key安全实践:后端代理接入

适用版本:ElaneMap H5 API 3.5
前置阅读:7.1-快速入门
适用读者:所有开发接入人员(上线前必读)

一、风险说明:为什么不能把密钥明文写在前端#

官方示例代码中,密钥以两种方式出现在前端:
这种写法用于本地调试没有问题,但直接用于生产环境存在明显风险:
1.
任何人可见:浏览器"查看源代码"、开发者工具、抓包工具都能直接拿到密钥;
2.
被盗用产生费用:密钥通常绑定调用配额/流量计费,被盗刷会产生经济损失,甚至触发限流影响自身业务;
3.
代码仓库泄露:硬编码进前端代码后,随 Git 提交进入仓库,仓库一旦公开或泄露,密钥永久外泄(Git 历史记录中仍存在);
4.
无法单独回收:泄露后只能整体更换密钥,影响所有环境。
下面按"必须做 → 建议做 → 进阶做"三个层次给出防护方案。

二、方案一(必须做):密钥与域名绑定#

绝大多数商用地图 API 的密钥支持绑定授权域名(Referer 白名单):只有来自白名单域名的请求才被放行,密钥即使被别人复制走,在非授权域名下也无法使用。
操作建议:
1.
申请密钥时,或开通服务后,联系船讯网商务/技术支持,要求将密钥绑定到您的正式域名(如 map.yourcompany.com),可同时绑定测试域名;
2.
本地开发使用的密钥与生产密钥分开申请两个:开发密钥绑定 localhost,生产密钥绑定正式域名;
3.
定期检查密钥调用量,发现异常峰值及时联系船讯网核查。
这是最基础、成本最低且最有效的一道防线。即使后续方案都不做,这一条也必须落实。

三、方案二(建议做):密钥不进代码仓库#

3.1 环境变量管理#

无论原生 HTML 还是 Vue/React 工程,密钥都不要直接写在提交的代码中:
Vue/cli 工程:使用 .env、.env.production 等环境文件,并将 .env.local 加入 .gitignore;
原生 HTML:由后端模板渲染时注入,或构建时由 CI/CD 变量替换占位符。

3.2 后端动态下发#

前端不保存密钥,页面加载时先从自家后端接口获取(可叠加登录态、权限校验、调用日志):
注意:此方案只解决"密钥不进代码仓库"的问题。密钥下发到浏览器后仍可被该用户本人看到,因此必须与方案一(域名绑定)配合使用。

四、方案三(进阶做):后端代理数据接口#

对于数据类接口(船位、轨迹、气象等 JSON 数据),如果业务上不希望密钥随任何前端请求暴露,可以采用后端代理模式:前端只请求自家后端,自家后端在服务器侧携带密钥去请求船讯网接口,再把结果返回前端。整个链路中密钥不出服务器。

4.1 架构示意#

浏览器 ──(不含密钥)──> 自家后端 /proxy/xxx ──(带密钥)──> 船讯网数据接口
   <────── 返回数据 ────── 自家后端 <────── 返回数据 ──────
代理层可以顺便做:鉴权(登录态)、限流、缓存(如气象数据按分钟级缓存)、审计日志。

4.2 Node.js(Express)代理示例#

4.3 Nginx 反向代理示例(无代码方案)#

如果只是想快速隐藏数据接口密钥,也可以直接在 Nginx 层注入:
说明:纯 Nginx 在"按条件追加 query 参数"上能力有限,复杂注入建议用 Nginx+Lua(OpenResty)或上面的 Node/Java 应用层代理实现。

4.4 哪些适合代理,哪些不适合#

内容是否适合后端代理说明
船位/轨迹/气象等 JSON 数据接口适合请求量可控,可加缓存,收益最大
API 主 JS 文件(?k=)不适合属于静态库加载,且地图初始化的 ak 参数在前端不可避免
海图瓦片(tile.c 等)不建议瓦片请求量大,代理会显著增加带宽成本与延迟,建议依靠域名绑定防护
因此实际落地的组合策略是:JS 库与瓦片靠"域名绑定"防护,数据接口视敏感度选择性走后端代理。

五、上线前安全检查清单#

生产密钥已与正式域名绑定(方案一)
代码仓库(含历史提交)中不存在任何真实密钥
开发/测试/生产使用不同密钥
密钥由环境变量/配置中心/后端下发管理,而非硬编码
敏感数据接口已评估是否走后端代理
已配置密钥调用量监控与异常告警(通过船讯网后台或定期核对)
已制定密钥泄露应急预案(联系船讯网更换密钥的流程与责任人)

六、常见问题 FAQ#

Q1:地图初始化的 ak 参数在前端无法隐藏,怎么办?
A:是的,ak 必须在前端传给 ShipxyAPI.Map,这是该版本 API 的机制。因此防护重心放在"域名绑定"上——密钥离开授权域名即失效,明文可见但不影响安全。
Q2:密钥疑似泄露了怎么处理?
A:第一时间联系船讯网更换密钥;同时检查调用量记录确认损失范围;排查泄露途径(代码仓库、前端页面、外包人员),修复后再启用新密钥。
Q3:后端代理会不会影响性能?
A:数据接口代理增加一跳延迟(通常几十毫秒),对船位刷新(秒级)影响可忽略;配合分钟级缓存还能降低密钥配额消耗。瓦片不要代理。
Q4:多人协作开发如何分发密钥?
A:不要通过聊天工具直接发送。使用团队密码管理工具或配置中心下发;每人尽量使用个人开发密钥,便于追溯。
上一页
7.7 Vue项目接入指南
下一页
8 海事数据