百度地图开发指南:如何获取并管理AK访问密钥

一、AK的核心作用与开发前提

在百度地图JavaScript API、Web服务API或移动端SDK的开发场景中,AK(Access Key)是开发者访问地图服务的唯一身份凭证。其作用类似于”数字通行证”,通过与请求参数的绑定验证开发者身份,同时限制不同AK的调用权限(如免费额度、功能模块等)。

开发者需明确AK与SK(Secret Key)的区别:AK用于公开的请求鉴权,而SK仅用于服务端签名验证(如使用Web服务API时)。本文重点讨论AK的获取与管理,SK的使用场景将在后续安全章节提及。

二、AK申请的完整流程

1. 开发者账号注册与认证

访问百度智能云官网,完成个人或企业账号注册。企业账号需通过实名认证(上传营业执照等材料),个人账号需绑定手机号及身份证信息。认证通过后,账号将获得基础服务权限。

2. 创建地图服务应用

登录百度智能云控制台,进入”地图服务”板块:

  1. 选择”应用管理” → “创建应用”
  2. 填写应用名称(如”订单追踪系统”)、应用类型(Web/Android/iOS等)
  3. 配置安全域名/包名(Web端需填写域名白名单,移动端需填写应用包名)
  4. 提交后系统自动生成AK,同时显示在应用详情页

关键配置说明

  • 安全域名支持通配符(如*.example.com),但需符合域名规范
  • 移动端包名需与发布版本一致(如Android的com.example.app
  • 每个账号最多可创建20个应用,超出需申请扩容

3. AK类型与权限选择

百度地图提供两种AK类型:

  • 浏览器端AK:用于JavaScript API调用,需配置安全域名
  • 服务端AK:用于Web服务API调用,需配合SK进行签名

在创建应用时,需根据开发场景选择对应类型。混合开发场景(如同时使用JS API和Web服务API)需创建两个独立应用,分别获取不同AK。

三、AK的安全管理最佳实践

1. 权限分级策略

百度地图控制台支持为不同AK配置差异化权限:

  • 功能模块权限:可单独控制地图、检索、路径规划等服务的访问
  • 调用频率限制:设置每秒/每日最大请求数(QPS/DPS)
  • IP白名单:限制AK仅在指定服务器IP使用(服务端AK专用)

配置示例

  1. {
  2. "ak": "your_access_key",
  3. "permissions": {
  4. "map": true,
  5. "place_search": true,
  6. "route_matrix": false
  7. },
  8. "rate_limit": {
  9. "qps": 10,
  10. "dps": 1000
  11. },
  12. "ip_whitelist": ["192.168.1.100", "10.0.0.1"]
  13. }

2. 动态AK管理方案

为降低AK泄露风险,可采用以下策略:

  • 短期有效AK:通过服务端API动态生成临时AK(需配合SK实现)
  • 环境隔离:开发/测试/生产环境使用不同AK
  • 密钥轮换:定期更换AK并更新所有调用端

临时AK生成示例(Node.js)

  1. const crypto = require('crypto');
  2. const axios = require('axios');
  3. async function generateTempAK(sk, durationSec = 3600) {
  4. const timestamp = Math.floor(Date.now() / 1000);
  5. const expire = timestamp + durationSec;
  6. const signStr = `ak=your_permanent_ak&expire=${expire}&sk=${sk}`;
  7. const signature = crypto.createHash('md5').update(signStr).digest('hex');
  8. const response = await axios.post('https://api.map.baidu.com/tempak', {
  9. ak: 'your_permanent_ak',
  10. expire,
  11. signature
  12. });
  13. return response.data.temp_ak;
  14. }

3. 泄露应急处理

发现AK泄露后需立即执行:

  1. 在控制台禁用该AK
  2. 生成新AK并更新所有调用代码
  3. 检查日志确认泄露范围
  4. 评估是否需要重置关联的SK

四、AK在代码中的集成示例

1. JavaScript API集成

  1. <script>
  2. // 初始化地图(使用浏览器端AK)
  3. var map = new BMap.Map("container", {
  4. ak: "your_browser_ak",
  5. enableMapClick: false
  6. });
  7. map.centerAndZoom(new BMap.Point(116.404, 39.915), 15);
  8. </script>

2. Web服务API调用(Node.js)

  1. const axios = require('axios');
  2. const crypto = require('crypto');
  3. // 生成签名(服务端AK需配合SK)
  4. function generateSign(params, sk) {
  5. const sortedParams = Object.keys(params)
  6. .filter(key => key !== 'sign')
  7. .sort()
  8. .map(key => `${key}=${params[key]}`)
  9. .join('&');
  10. return crypto.createHash('md5')
  11. .update(`${sortedParams}&${sk}`)
  12. .digest('hex');
  13. }
  14. // 调用地点搜索API
  15. async function searchPlace(query) {
  16. const params = {
  17. query,
  18. region: "北京",
  19. output: "json",
  20. ak: "your_server_ak"
  21. };
  22. params.sign = generateSign(params, "your_secret_key");
  23. const response = await axios.get('https://api.map.baidu.com/place/v2/search', { params });
  24. return response.data;
  25. }

五、常见问题与解决方案

1. AK返回”权限不足”错误

  • 检查AK类型是否匹配调用场景(浏览器端AK不能用于服务端API)
  • 确认控制台已开启对应功能模块权限
  • 验证安全域名/包名配置是否正确

2. 调用频率超限

  • 在控制台调整QPS/DPS限制
  • 实现请求队列或退避算法(如指数退避)
  • 考虑升级服务套餐提高配额

3. 移动端AK失效

  • 检查包名是否与AndroidManifest.xml或Info.plist中的配置一致
  • 确认是否使用了正确的AK类型(移动端需专用AK)
  • 检查是否在非白名单设备调试(需在控制台添加测试设备ID)

六、进阶优化建议

  1. 监控体系搭建:通过百度云监控设置AK调用量、错误率等指标的告警
  2. 成本优化:分析调用日志,淘汰低效API调用,合并批量请求
  3. 灾备设计:主备AK切换机制,避免单点故障导致服务中断
  4. 合规审计:定期导出AK调用日志,满足等保2.0等合规要求

通过系统化的AK管理,开发者可构建安全、高效的地图服务架构。建议将AK管理纳入DevOps流程,实现从申请、使用到注销的全生命周期自动化管控。